blob: 9ec044b33e673425acd6658dd93cd56b32a26ccf [file] [log] [blame]
// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "shill/mobile_operator.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "shill/cellular_service.h" // TODO(armansito): Remove once OLP moves.
#include "shill/mock_cellular_operator_info.h"
#include "shill/mock_modem_info.h"
using testing::_;
using testing::Mock;
using testing::Return;
namespace shill {
namespace {
const char kTestMobileProviderDbPath[] = "provider_db_unittest.bfd";
const char kTestUnknownOperatorCode[] = "unknown-code";
const char kTestUnknownOperatorName[] = "unknown-name";
const char kTestOperatorInfoCodeMccmnc[] = "test-mccmnc";
const char kTestOperatorInfoCodeSid[] = "test-sid";
const char kTestNoOlpOperatorInfoCode[] = "no-olp-code";
const char kTestOperatorInfoName[] = "test-operator-name";
const char kTestOperatorInfoCountry[] = "test-country";
const char kTestOlpUrl[] = "test-url";
const char kTestOlpMethod[] = "test-method";
const char kTestOlpPostData[] = "test-post-data";
const char kTestLocalizedName[] = "test-localized-name";
const char kTestLocalizedNameLanguage[] = "test-localized-name-language";
const char kTestApn0[] = "test-apn0";
const char kTestApnUsername0[] = "test-apn-username0";
const char kTestApnPassword0[] = "test-apn-password0";
const char kTestApn1[] = "test-apn1";
const char kTestApnUsername1[] = "test-apn-username1";
const char kTestApnPassword1[] = "test-apn-password1";
const char kProviderDbCode0[] = "22803";
const char kProviderDbName0[] = "Orange";
const char kProviderDbCountry0[] = "ch";
const char kProviderDbCode1[] = "310038";
const char kProviderDbName1[] = "AT&T";
const char kProviderDbCountry1[] = "us";
} // namespace
class TestMobileOperatorObserver : public MobileOperator::Observer {
public:
MOCK_METHOD1(OnHomeProviderInfoChanged, void(const MobileOperator *));
MOCK_METHOD1(OnServingOperatorInfoChanged, void(const MobileOperator *));
MOCK_METHOD1(OnApnListChanged, void(const MobileOperator *));
MOCK_METHOD1(OnOnlinePaymentUrlTemplateChanged,
void(const MobileOperator *));
};
class MobileOperatorTest : public testing::Test {
public:
MobileOperatorTest()
: modem_info_(NULL, NULL, NULL, NULL, NULL),
operator_(&modem_info_) {}
void SetUp() {
operator_.AddObserver(&observer_);
modem_info_.SetProviderDB(kTestMobileProviderDbPath);
SetupCellularOperatorInfo();
}
void TearDown() {
operator_.RemoveObserver(&observer_);
}
// Called from SetUp.
void SetupCellularOperatorInfo() {
test_olp_.SetURL(kTestOlpUrl);
test_olp_.SetMethod(kTestOlpMethod);
test_olp_.SetPostData(kTestOlpPostData);
CellularOperatorInfo::LocalizedName name;
name.name = kTestOperatorInfoName;
test_operator_.name_list_.push_back(name);
test_operator_.country_ = kTestOperatorInfoCountry;
ON_CALL(*modem_info_.mock_cellular_operator_info(),
GetCellularOperatorByMCCMNC(_))
.WillByDefault(Return(nullptr));
ON_CALL(*modem_info_.mock_cellular_operator_info(),
GetCellularOperatorByMCCMNC(kTestOperatorInfoCodeMccmnc))
.WillByDefault(Return(&test_operator_));
ON_CALL(*modem_info_.mock_cellular_operator_info(),
GetCellularOperatorByMCCMNC(kTestNoOlpOperatorInfoCode))
.WillByDefault(Return(&test_operator_));
ON_CALL(*modem_info_.mock_cellular_operator_info(),
GetCellularOperatorBySID(_))
.WillByDefault(Return(nullptr));
ON_CALL(*modem_info_.mock_cellular_operator_info(),
GetCellularOperatorBySID(kTestOperatorInfoCodeSid))
.WillByDefault(Return(&test_operator_));
ON_CALL(*modem_info_.mock_cellular_operator_info(),
GetCellularOperatorBySID(kTestNoOlpOperatorInfoCode))
.WillByDefault(Return(&test_operator_));
ON_CALL(*modem_info_.mock_cellular_operator_info(),
GetOLPByMCCMNC(_))
.WillByDefault(Return(nullptr));
ON_CALL(*modem_info_.mock_cellular_operator_info(),
GetOLPByMCCMNC(kTestOperatorInfoCodeMccmnc))
.WillByDefault(Return(&test_olp_));
ON_CALL(*modem_info_.mock_cellular_operator_info(),
GetOLPBySID(_))
.WillByDefault(Return(nullptr));
ON_CALL(*modem_info_.mock_cellular_operator_info(),
GetOLPBySID(kTestOperatorInfoCodeSid))
.WillByDefault(Return(&test_olp_));
}
// Called from tests.
void SetupApnList() {
CellularOperatorInfo::LocalizedName localized_name(
kTestLocalizedName, kTestLocalizedNameLanguage);
CellularOperatorInfo::MobileAPN *apn = new CellularOperatorInfo::MobileAPN;
apn->apn = kTestApn0;
apn->username = kTestApnUsername0;
apn->password = kTestApnPassword0;
apn->name_list.push_back(localized_name);
test_operator_.apn_list_.push_back(apn); // Passes ownership.
apn = new CellularOperatorInfo::MobileAPN;
apn->apn = kTestApn1;
apn->username = kTestApnUsername1;
apn->password = kTestApnPassword1;
apn->name_list.push_back(CellularOperatorInfo::LocalizedName(
kTestOperatorInfoName, ""));
apn->name_list.push_back(localized_name);
test_operator_.apn_list_.push_back(apn); // Passes ownership.
}
protected:
MockModemInfo modem_info_;
MobileOperator operator_;
TestMobileOperatorObserver observer_;
CellularOperatorInfo::CellularOperator test_operator_;
CellularService::OLP test_olp_;
};
TEST_F(MobileOperatorTest, OtaOperatorInfoReceivedNotFound) {
EXPECT_TRUE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_TRUE(operator_.apn_list().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(0);
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(0);
EXPECT_CALL(observer_, OnApnListChanged(_)).Times(0);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
operator_.OtaOperatorInfoReceived(
"", "", MobileOperator::kOperatorCodeTypeMCCMNC);
operator_.OtaOperatorInfoReceived(
"", "", MobileOperator::kOperatorCodeTypeSID);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(2);
operator_.OtaOperatorInfoReceived(kTestUnknownOperatorCode, "",
MobileOperator::kOperatorCodeTypeMCCMNC);
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_EQ(kTestUnknownOperatorCode,
operator_.serving_operator().find("code")->second);
EXPECT_EQ(operator_.serving_operator().end(),
operator_.serving_operator().find("name"));
operator_.OtaOperatorInfoReceived("", kTestUnknownOperatorName,
MobileOperator::kOperatorCodeTypeMCCMNC);
EXPECT_EQ(operator_.serving_operator().end(),
operator_.serving_operator().find("code"));
EXPECT_EQ(kTestUnknownOperatorName,
operator_.serving_operator().find("name")->second);
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_TRUE(operator_.apn_list().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
}
TEST_F(MobileOperatorTest, SimOperatorInfoReceivedNotFound) {
EXPECT_TRUE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_TRUE(operator_.apn_list().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(0);
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(0);
EXPECT_CALL(observer_, OnApnListChanged(_)).Times(0);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
operator_.SimOperatorInfoReceived("", "");
Mock::VerifyAndClearExpectations(&observer_);
operator_.SimOperatorInfoReceived(kTestUnknownOperatorCode, "");
EXPECT_FALSE(operator_.home_provider().empty());
EXPECT_EQ(kTestUnknownOperatorCode,
operator_.home_provider().find("code")->second);
EXPECT_EQ(operator_.home_provider().end(),
operator_.home_provider().find("name"));
operator_.SimOperatorInfoReceived("", kTestUnknownOperatorName);
EXPECT_EQ(operator_.home_provider().end(),
operator_.home_provider().find("code"));
EXPECT_EQ(kTestUnknownOperatorName,
operator_.home_provider().find("name")->second);
EXPECT_TRUE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.apn_list().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
}
TEST_F(MobileOperatorTest, OtaOperatorInfoReceivedMccmnc) {
// Operator code only.
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(0);
EXPECT_CALL(observer_, OnApnListChanged(_)).Times(0);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(1);
operator_.OtaOperatorInfoReceived(kTestNoOlpOperatorInfoCode, "",
MobileOperator::kOperatorCodeTypeMCCMNC);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kTestNoOlpOperatorInfoCode,
operator_.serving_operator().find("code")->second);
EXPECT_EQ(kTestOperatorInfoName,
operator_.serving_operator().find("name")->second);
EXPECT_EQ(kTestOperatorInfoCountry,
operator_.serving_operator().find("country")->second);
// Update to same value.
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(0);
EXPECT_CALL(observer_, OnApnListChanged(_)).Times(0);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(0);
operator_.OtaOperatorInfoReceived(kTestNoOlpOperatorInfoCode,
kTestOperatorInfoName,
MobileOperator::kOperatorCodeTypeMCCMNC);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kTestNoOlpOperatorInfoCode,
operator_.serving_operator().find("code")->second);
EXPECT_EQ(kTestOperatorInfoName,
operator_.serving_operator().find("name")->second);
EXPECT_EQ(kTestOperatorInfoCountry,
operator_.serving_operator().find("country")->second);
// Update With OLP.
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(1);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(1);
operator_.OtaOperatorInfoReceived(kTestOperatorInfoCodeMccmnc, "",
MobileOperator::kOperatorCodeTypeMCCMNC);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_EQ(kTestOperatorInfoCodeMccmnc,
operator_.serving_operator().find("code")->second);
EXPECT_EQ(kTestOperatorInfoName,
operator_.serving_operator().find("name")->second);
EXPECT_FALSE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kTestOlpUrl,
operator_.online_payment_url_template().find("url")->second);
EXPECT_EQ(kTestOlpMethod,
operator_.online_payment_url_template().find("method")->second);
EXPECT_EQ(kTestOlpPostData,
operator_.online_payment_url_template().find("postdata")->second);
// Update just the operator name.
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(1);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
operator_.OtaOperatorInfoReceived(kTestOperatorInfoCodeMccmnc, "banana",
MobileOperator::kOperatorCodeTypeMCCMNC);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_EQ(kTestOperatorInfoCodeMccmnc,
operator_.serving_operator().find("code")->second);
EXPECT_EQ("banana",
operator_.serving_operator().find("name")->second);
EXPECT_FALSE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kTestOlpUrl,
operator_.online_payment_url_template().find("url")->second);
EXPECT_EQ(kTestOlpMethod,
operator_.online_payment_url_template().find("method")->second);
EXPECT_EQ(kTestOlpPostData,
operator_.online_payment_url_template().find("postdata")->second);
}
TEST_F(MobileOperatorTest, OtaOperatorInfoReceivedSid) {
// Operator code only.
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(0);
EXPECT_CALL(observer_, OnApnListChanged(_)).Times(0);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(1);
operator_.OtaOperatorInfoReceived(kTestNoOlpOperatorInfoCode, "",
MobileOperator::kOperatorCodeTypeSID);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kTestNoOlpOperatorInfoCode,
operator_.serving_operator().find("code")->second);
EXPECT_EQ(kTestOperatorInfoName,
operator_.serving_operator().find("name")->second);
EXPECT_EQ(kTestOperatorInfoCountry,
operator_.serving_operator().find("country")->second);
// Update to same value.
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(0);
EXPECT_CALL(observer_, OnApnListChanged(_)).Times(0);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(0);
operator_.OtaOperatorInfoReceived(kTestNoOlpOperatorInfoCode,
kTestOperatorInfoName,
MobileOperator::kOperatorCodeTypeSID);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kTestNoOlpOperatorInfoCode,
operator_.serving_operator().find("code")->second);
EXPECT_EQ(kTestOperatorInfoName,
operator_.serving_operator().find("name")->second);
EXPECT_EQ(kTestOperatorInfoCountry,
operator_.serving_operator().find("country")->second);
// Update With OLP.
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(1);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(1);
operator_.OtaOperatorInfoReceived(kTestOperatorInfoCodeSid, "",
MobileOperator::kOperatorCodeTypeSID);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_EQ(kTestOperatorInfoCodeSid,
operator_.serving_operator().find("code")->second);
EXPECT_EQ(kTestOperatorInfoName,
operator_.serving_operator().find("name")->second);
EXPECT_FALSE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kTestOlpUrl,
operator_.online_payment_url_template().find("url")->second);
EXPECT_EQ(kTestOlpMethod,
operator_.online_payment_url_template().find("method")->second);
EXPECT_EQ(kTestOlpPostData,
operator_.online_payment_url_template().find("postdata")->second);
// Update just the operator name.
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(1);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
operator_.OtaOperatorInfoReceived(kTestOperatorInfoCodeSid, "banana",
MobileOperator::kOperatorCodeTypeSID);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_EQ(kTestOperatorInfoCodeSid,
operator_.serving_operator().find("code")->second);
EXPECT_EQ("banana",
operator_.serving_operator().find("name")->second);
EXPECT_FALSE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kTestOlpUrl,
operator_.online_payment_url_template().find("url")->second);
EXPECT_EQ(kTestOlpMethod,
operator_.online_payment_url_template().find("method")->second);
EXPECT_EQ(kTestOlpPostData,
operator_.online_payment_url_template().find("postdata")->second);
}
TEST_F(MobileOperatorTest, OtaReceivedMobileProviderDb) {
// Update with operator ID that doesn't exist in COI but is in
// the mobile provider db.
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(0);
EXPECT_CALL(observer_, OnApnListChanged(_)).Times(1);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(1);
operator_.OtaOperatorInfoReceived(kProviderDbCode0, "",
MobileOperator::kOperatorCodeTypeMCCMNC);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kProviderDbCode0,
operator_.serving_operator().find("code")->second);
EXPECT_EQ(kProviderDbName0,
operator_.serving_operator().find("name")->second);
EXPECT_EQ(kProviderDbCountry0,
operator_.serving_operator().find("country")->second);
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(0);
EXPECT_CALL(observer_, OnApnListChanged(_)).Times(1);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(1);
operator_.OtaOperatorInfoReceived(kProviderDbCode1, "",
MobileOperator::kOperatorCodeTypeMCCMNC);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kProviderDbCode1,
operator_.serving_operator().find("code")->second);
EXPECT_EQ(kProviderDbName1,
operator_.serving_operator().find("name")->second);
EXPECT_EQ(kProviderDbCountry1,
operator_.serving_operator().find("country")->second);
// Look up by name.
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(0);
EXPECT_CALL(observer_, OnApnListChanged(_)).Times(1);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(1);
operator_.OtaOperatorInfoReceived("", kProviderDbName0,
MobileOperator::kOperatorCodeTypeMCCMNC);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_EQ(operator_.serving_operator().end(),
operator_.serving_operator().find("code"));
EXPECT_EQ(kProviderDbName0,
operator_.serving_operator().find("name")->second);
EXPECT_EQ(operator_.serving_operator().end(),
operator_.serving_operator().find("country"));
// mobile provider DB doesn't support SID.
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(0);
EXPECT_CALL(observer_, OnApnListChanged(_)).Times(0);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(1);
operator_.OtaOperatorInfoReceived(kProviderDbCode0, "",
MobileOperator::kOperatorCodeTypeSID);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kProviderDbCode0,
operator_.serving_operator().find("code")->second);
EXPECT_EQ(operator_.serving_operator().end(),
operator_.serving_operator().find("name"));
EXPECT_EQ(operator_.serving_operator().end(),
operator_.serving_operator().find("country"));
}
TEST_F(MobileOperatorTest, SimOperatorInfoReceived) {
// Operator code only.
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(1);
EXPECT_CALL(observer_, OnApnListChanged(_)).Times(0);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(0);
operator_.SimOperatorInfoReceived(kTestNoOlpOperatorInfoCode, "");
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_FALSE(operator_.home_provider().empty());
EXPECT_TRUE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kTestNoOlpOperatorInfoCode,
operator_.home_provider().find("code")->second);
EXPECT_EQ(kTestOperatorInfoName,
operator_.home_provider().find("name")->second);
EXPECT_EQ(kTestOperatorInfoCountry,
operator_.home_provider().find("country")->second);
// Update to same value.
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(0);
EXPECT_CALL(observer_, OnApnListChanged(_)).Times(0);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(0);
operator_.SimOperatorInfoReceived(kTestNoOlpOperatorInfoCode, "");
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_FALSE(operator_.home_provider().empty());
EXPECT_TRUE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kTestNoOlpOperatorInfoCode,
operator_.home_provider().find("code")->second);
EXPECT_EQ(kTestOperatorInfoName,
operator_.home_provider().find("name")->second);
EXPECT_EQ(kTestOperatorInfoCountry,
operator_.home_provider().find("country")->second);
// Update with OLP: OLP shouldn't change.
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(1);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
operator_.SimOperatorInfoReceived(kTestOperatorInfoCodeMccmnc, "");
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_FALSE(operator_.home_provider().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kTestOperatorInfoCodeMccmnc,
operator_.home_provider().find("code")->second);
EXPECT_EQ(kTestOperatorInfoName,
operator_.home_provider().find("name")->second);
// Update just the operator name.
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(1);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
operator_.SimOperatorInfoReceived(kTestOperatorInfoCodeMccmnc, "banana");
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_FALSE(operator_.home_provider().empty());
EXPECT_EQ(kTestOperatorInfoCodeMccmnc,
operator_.home_provider().find("code")->second);
EXPECT_EQ("banana",
operator_.home_provider().find("name")->second);
EXPECT_TRUE(operator_.online_payment_url_template().empty());
// Try passing a SID. No matching entry will be found.
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(1);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
operator_.SimOperatorInfoReceived(kTestOperatorInfoCodeSid, "");
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_FALSE(operator_.home_provider().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_EQ(kTestOperatorInfoCodeSid,
operator_.home_provider().find("code")->second);
EXPECT_EQ(operator_.home_provider().end(),
operator_.home_provider().find("name"));
EXPECT_EQ(operator_.home_provider().end(),
operator_.home_provider().find("country"));
}
TEST_F(MobileOperatorTest, ApnListUpdate) {
SetupApnList();
EXPECT_TRUE(operator_.apn_list().empty());
EXPECT_TRUE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
// Set MCCMNC OTA.
EXPECT_CALL(observer_, OnApnListChanged(_)).Times(3);
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(3);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(2);
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(0);
operator_.OtaOperatorInfoReceived(kTestOperatorInfoCodeMccmnc, "",
MobileOperator::kOperatorCodeTypeMCCMNC);
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_FALSE(operator_.online_payment_url_template().empty());
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_EQ(2, operator_.apn_list().size());
EXPECT_EQ(kTestApn0, operator_.apn_list()[0].find(kApnProperty)->second);
EXPECT_EQ(kTestApnUsername0,
operator_.apn_list()[0].find(kApnUsernameProperty)->second);
EXPECT_EQ(kTestApnPassword0,
operator_.apn_list()[0].find(kApnPasswordProperty)->second);
EXPECT_EQ(kTestLocalizedName,
operator_.apn_list()[0].find(kApnLocalizedNameProperty)->second);
EXPECT_EQ(kTestLocalizedNameLanguage,
operator_.apn_list()[0].find(kApnLanguageProperty)->second);
EXPECT_EQ(operator_.apn_list()[0].end(),
operator_.apn_list()[0].find(kApnNameProperty));
EXPECT_EQ(kTestApn1, operator_.apn_list()[1].find("apn")->second);
EXPECT_EQ(kTestApnUsername1,
operator_.apn_list()[1].find(kApnUsernameProperty)->second);
EXPECT_EQ(kTestApnPassword1,
operator_.apn_list()[1].find(kApnPasswordProperty)->second);
EXPECT_EQ(kTestLocalizedName,
operator_.apn_list()[1].find(kApnLocalizedNameProperty)->second);
EXPECT_EQ(kTestLocalizedNameLanguage,
operator_.apn_list()[1].find(kApnLanguageProperty)->second);
EXPECT_EQ(kTestOperatorInfoName,
operator_.apn_list()[1].find(kApnNameProperty)->second);
// Update APN list via provider DB.
operator_.OtaOperatorInfoReceived(
"22801", "", MobileOperator::kOperatorCodeTypeMCCMNC);
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_EQ(1, operator_.apn_list().size());
EXPECT_EQ("gprs.swisscom.ch",
operator_.apn_list()[0].find(kApnProperty)->second);
EXPECT_EQ(operator_.apn_list()[0].end(),
operator_.apn_list()[0].find(kApnUsernameProperty));
EXPECT_EQ(operator_.apn_list()[0].end(),
operator_.apn_list()[0].find(kApnPasswordProperty));
EXPECT_EQ(operator_.apn_list()[0].end(),
operator_.apn_list()[0].find(kApnLocalizedNameProperty));
EXPECT_EQ(operator_.apn_list()[0].end(),
operator_.apn_list()[0].find(kApnLanguageProperty));
EXPECT_EQ(operator_.apn_list()[0].end(),
operator_.apn_list()[0].find(kApnNameProperty));
operator_.OtaOperatorInfoReceived(
"310160", "", MobileOperator::kOperatorCodeTypeMCCMNC);
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_TRUE(operator_.home_provider().empty());
EXPECT_EQ(4, operator_.apn_list().size());
EXPECT_EQ("epc.tmobile.com",
operator_.apn_list()[0].find(kApnProperty)->second);
EXPECT_EQ(operator_.apn_list()[0].end(),
operator_.apn_list()[0].find(kApnUsernameProperty));
EXPECT_EQ(operator_.apn_list()[0].end(),
operator_.apn_list()[0].find(kApnPasswordProperty));
EXPECT_EQ(operator_.apn_list()[0].end(),
operator_.apn_list()[0].find(kApnLocalizedNameProperty));
EXPECT_EQ(operator_.apn_list()[0].end(),
operator_.apn_list()[0].find(kApnLanguageProperty));
EXPECT_EQ("Internet/WebConnect",
operator_.apn_list()[0].find(kApnNameProperty)->second);
EXPECT_EQ("wap.voicestream.com",
operator_.apn_list()[1].find(kApnProperty)->second);
EXPECT_EQ(operator_.apn_list()[1].end(),
operator_.apn_list()[1].find(kApnUsernameProperty));
EXPECT_EQ(operator_.apn_list()[1].end(),
operator_.apn_list()[1].find(kApnPasswordProperty));
EXPECT_EQ(operator_.apn_list()[1].end(),
operator_.apn_list()[1].find(kApnLocalizedNameProperty));
EXPECT_EQ(operator_.apn_list()[1].end(),
operator_.apn_list()[1].find(kApnLanguageProperty));
EXPECT_EQ("Web2Go/t-zones",
operator_.apn_list()[1].find(kApnNameProperty)->second);
EXPECT_EQ("internet2.voicestream.com",
operator_.apn_list()[2].find(kApnProperty)->second);
EXPECT_EQ(operator_.apn_list()[2].end(),
operator_.apn_list()[2].find(kApnUsernameProperty));
EXPECT_EQ(operator_.apn_list()[2].end(),
operator_.apn_list()[2].find(kApnPasswordProperty));
EXPECT_EQ(operator_.apn_list()[2].end(),
operator_.apn_list()[2].find(kApnLocalizedNameProperty));
EXPECT_EQ(operator_.apn_list()[2].end(),
operator_.apn_list()[2].find(kApnLanguageProperty));
EXPECT_EQ("Internet (old)",
operator_.apn_list()[2].find(kApnNameProperty)->second);
EXPECT_EQ("internet3.voicestream.com",
operator_.apn_list()[3].find(kApnProperty)->second);
EXPECT_EQ(operator_.apn_list()[3].end(),
operator_.apn_list()[3].find(kApnUsernameProperty));
EXPECT_EQ(operator_.apn_list()[3].end(),
operator_.apn_list()[3].find(kApnPasswordProperty));
EXPECT_EQ(operator_.apn_list()[3].end(),
operator_.apn_list()[3].find(kApnLocalizedNameProperty));
EXPECT_EQ(operator_.apn_list()[3].end(),
operator_.apn_list()[3].find(kApnLanguageProperty));
EXPECT_EQ("Internet with VPN (old)",
operator_.apn_list()[3].find(kApnNameProperty)->second);
Mock::VerifyAndClearExpectations(&observer_);
// Set from SIM. This shouldn't update the APN list.
EXPECT_CALL(observer_, OnApnListChanged(_)).Times(0);
EXPECT_CALL(observer_, OnServingOperatorInfoChanged(_)).Times(0);
EXPECT_CALL(observer_, OnOnlinePaymentUrlTemplateChanged(_)).Times(0);
EXPECT_CALL(observer_, OnHomeProviderInfoChanged(_)).Times(1);
operator_.SimOperatorInfoReceived(kTestOperatorInfoCodeMccmnc, "");
EXPECT_FALSE(operator_.serving_operator().empty());
EXPECT_TRUE(operator_.online_payment_url_template().empty());
EXPECT_FALSE(operator_.home_provider().empty());
EXPECT_EQ(4, operator_.apn_list().size());
}
} // namespace shill