1 // 2 // Copyright (C) 2014 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include "shill/cellular/mobile_operator_info.h" 18 19 #include <fstream> 20 #include <map> 21 #include <ostream> 22 #include <set> 23 #include <vector> 24 25 #include <base/files/file_util.h> 26 #include <base/macros.h> 27 #include <gmock/gmock.h> 28 #include <gtest/gtest.h> 29 30 #include "shill/cellular/mobile_operator_info_impl.h" 31 #include "shill/logging.h" 32 #include "shill/test_event_dispatcher.h" 33 34 // These files contain binary protobuf definitions used by the following tests 35 // inside the namespace ::mobile_operator_db 36 #define IN_MOBILE_OPERATOR_INFO_UNITTEST_CC 37 #include "shill/mobile_operator_db/test_protos/data_test.h" 38 #include "shill/mobile_operator_db/test_protos/init_test_empty_db_init.h" 39 #include "shill/mobile_operator_db/test_protos/init_test_multiple_db_init_1.h" 40 #include "shill/mobile_operator_db/test_protos/init_test_multiple_db_init_2.h" 41 #include "shill/mobile_operator_db/test_protos/init_test_successful_init.h" 42 #include "shill/mobile_operator_db/test_protos/main_test.h" 43 #undef IN_MOBILE_OPERATOR_INFO_UNITTEST_CC 44 45 using base::FilePath; 46 using shill::mobile_operator_db::MobileOperatorDB; 47 using std::map; 48 using std::ofstream; 49 using std::set; 50 using std::string; 51 using std::vector; 52 using testing::Mock; 53 using testing::Test; 54 using testing::Values; 55 using testing::WithParamInterface; 56 57 // The tests run from the fixture |MobileOperatorInfoMainTest| and 58 // |MobileOperatorDataTest| can be run in two modes: 59 // - strict event checking: We check that an event is raised for each update 60 // to the state of the object. 61 // - non-strict event checking: We check that a single event is raised as a 62 // result of many updates to the object. 63 // The first case corresponds to a very aggressive event loop, that dispatches 64 // events as soon as they are posted; the second one corresponds to an 65 // over-crowded event loop that only dispatches events just before we verify 66 // that events were raised. 67 // 68 // We use ::testing::WithParamInterface to templatize the test fixtures to do 69 // string/non-strict event checking. When writing test cases using these 70 // fixtures, use the |Update*|, |ExpectEventCount|, |VerifyEventCount| functions 71 // provided by the fixture, and write the test as if event checking is strict. 72 // 73 // For |MobileOperatorObserverTest|, only the strict event checking case makes 74 // sense, so we only instantiate that. 75 namespace shill { 76 77 namespace { 78 79 enum EventCheckingPolicy { 80 kEventCheckingPolicyStrict, 81 kEventCheckingPolicyNonStrict 82 }; 83 84 } // namespace 85 86 class MockMobileOperatorInfoObserver : public MobileOperatorInfo::Observer { 87 public: 88 MockMobileOperatorInfoObserver() {} 89 virtual ~MockMobileOperatorInfoObserver() {} 90 91 MOCK_METHOD0(OnOperatorChanged, void()); 92 }; 93 94 class MobileOperatorInfoInitTest : public Test { 95 public: 96 MobileOperatorInfoInitTest() 97 : operator_info_(new MobileOperatorInfo(&dispatcher_, "Operator")), 98 operator_info_impl_(operator_info_->impl()) {} 99 100 void TearDown() override { 101 for (const auto& tmp_db_path : tmp_db_paths_) { 102 base::DeleteFile(tmp_db_path, false); 103 } 104 } 105 106 protected: 107 void AddDatabase(const unsigned char database_data[], size_t num_elems) { 108 FilePath tmp_db_path; 109 CHECK(base::CreateTemporaryFile(&tmp_db_path)); 110 tmp_db_paths_.push_back(tmp_db_path); 111 112 ofstream tmp_db(tmp_db_path.value(), ofstream::binary); 113 for (size_t i = 0; i < num_elems; ++i) { 114 tmp_db << database_data[i]; 115 } 116 tmp_db.close(); 117 operator_info_->AddDatabasePath(tmp_db_path); 118 } 119 120 void AssertDatabaseEmpty() { 121 EXPECT_EQ(0, operator_info_impl_->database()->mno_size()); 122 EXPECT_EQ(0, operator_info_impl_->database()->imvno_size()); 123 } 124 125 const MobileOperatorDB* GetDatabase() { 126 return operator_info_impl_->database(); 127 } 128 129 EventDispatcherForTest dispatcher_; 130 vector<FilePath> tmp_db_paths_; 131 std::unique_ptr<MobileOperatorInfo> operator_info_; 132 // Owned by |operator_info_| and tied to its life cycle. 133 MobileOperatorInfoImpl* operator_info_impl_; 134 135 private: 136 DISALLOW_COPY_AND_ASSIGN(MobileOperatorInfoInitTest); 137 }; 138 139 TEST_F(MobileOperatorInfoInitTest, FailedInitNoPath) { 140 // - Initialize object with no database paths set 141 // - Verify that initialization fails. 142 operator_info_->ClearDatabasePaths(); 143 EXPECT_FALSE(operator_info_->Init()); 144 AssertDatabaseEmpty(); 145 } 146 147 TEST_F(MobileOperatorInfoInitTest, FailedInitBadPath) { 148 // - Initialize object with non-existent path. 149 // - Verify that initialization fails. 150 const FilePath database_path("nonexistent.pbf"); 151 operator_info_->ClearDatabasePaths(); 152 operator_info_->AddDatabasePath(database_path); 153 EXPECT_FALSE(operator_info_->Init()); 154 AssertDatabaseEmpty(); 155 } 156 157 TEST_F(MobileOperatorInfoInitTest, FailedInitBadDatabase) { 158 // - Initialize object with malformed database. 159 // - Verify that initialization fails. 160 // TODO(pprabhu): It's hard to get a malformed database in binary format. 161 } 162 163 TEST_F(MobileOperatorInfoInitTest, EmptyDBInit) { 164 // - Initialize the object with a database file that is empty. 165 // - Verify that initialization succeeds, and that the database is empty. 166 operator_info_->ClearDatabasePaths(); 167 // Can't use arraysize on empty array. 168 AddDatabase(mobile_operator_db::init_test_empty_db_init, 0); 169 EXPECT_TRUE(operator_info_->Init()); 170 AssertDatabaseEmpty(); 171 } 172 173 TEST_F(MobileOperatorInfoInitTest, SuccessfulInit) { 174 operator_info_->ClearDatabasePaths(); 175 AddDatabase(mobile_operator_db::init_test_successful_init, 176 arraysize(mobile_operator_db::init_test_successful_init)); 177 EXPECT_TRUE(operator_info_->Init()); 178 EXPECT_GT(GetDatabase()->mno_size(), 0); 179 EXPECT_GT(GetDatabase()->imvno_size(), 0); 180 } 181 182 TEST_F(MobileOperatorInfoInitTest, MultipleDBInit) { 183 // - Initialize the object with two database files. 184 // - Verify that intialization succeeds, and both databases are loaded. 185 operator_info_->ClearDatabasePaths(); 186 AddDatabase(mobile_operator_db::init_test_multiple_db_init_1, 187 arraysize(mobile_operator_db::init_test_multiple_db_init_1)); 188 AddDatabase(mobile_operator_db::init_test_multiple_db_init_2, 189 arraysize(mobile_operator_db::init_test_multiple_db_init_2)); 190 operator_info_->Init(); 191 EXPECT_GT(GetDatabase()->mno_size(), 0); 192 EXPECT_GT(GetDatabase()->imvno_size(), 0); 193 } 194 195 TEST_F(MobileOperatorInfoInitTest, InitWithObserver) { 196 // - Add an Observer. 197 // - Initialize the object with empty database file. 198 // - Verify innitialization succeeds. 199 MockMobileOperatorInfoObserver dumb_observer; 200 201 operator_info_->ClearDatabasePaths(); 202 // Can't use arraysize with empty array. 203 AddDatabase(mobile_operator_db::init_test_empty_db_init, 0); 204 operator_info_->AddObserver(&dumb_observer); 205 EXPECT_TRUE(operator_info_->Init()); 206 } 207 208 class MobileOperatorInfoMainTest 209 : public MobileOperatorInfoInitTest, 210 public WithParamInterface<EventCheckingPolicy> { 211 public: 212 MobileOperatorInfoMainTest() 213 : MobileOperatorInfoInitTest(), 214 event_checking_policy_(GetParam()) {} 215 216 virtual void SetUp() { 217 operator_info_->ClearDatabasePaths(); 218 AddDatabase(mobile_operator_db::main_test, 219 arraysize(mobile_operator_db::main_test)); 220 operator_info_->Init(); 221 operator_info_->AddObserver(&observer_); 222 } 223 224 protected: 225 // /////////////////////////////////////////////////////////////////////////// 226 // Helper functions. 227 void VerifyMNOWithUUID(const string& uuid) { 228 EXPECT_TRUE(operator_info_->IsMobileNetworkOperatorKnown()); 229 EXPECT_FALSE(operator_info_->IsMobileVirtualNetworkOperatorKnown()); 230 EXPECT_EQ(uuid, operator_info_->uuid()); 231 } 232 233 void VerifyMVNOWithUUID(const string& uuid) { 234 EXPECT_TRUE(operator_info_->IsMobileNetworkOperatorKnown()); 235 EXPECT_TRUE(operator_info_->IsMobileVirtualNetworkOperatorKnown()); 236 EXPECT_EQ(uuid, operator_info_->uuid()); 237 } 238 239 void VerifyNoMatch() { 240 EXPECT_FALSE(operator_info_->IsMobileNetworkOperatorKnown()); 241 EXPECT_FALSE(operator_info_->IsMobileVirtualNetworkOperatorKnown()); 242 EXPECT_EQ("", operator_info_->uuid()); 243 } 244 245 void ExpectEventCount(int count) { 246 // In case we're running in the non-strict event checking mode, we only 247 // expect one overall event to be raised for all the updates. 248 if (event_checking_policy_ == kEventCheckingPolicyNonStrict) { 249 count = (count > 0) ? 1 : 0; 250 } 251 EXPECT_CALL(observer_, OnOperatorChanged()).Times(count); 252 } 253 254 void VerifyEventCount() { 255 dispatcher_.DispatchPendingEvents(); 256 Mock::VerifyAndClearExpectations(&observer_); 257 } 258 259 void ResetOperatorInfo() { 260 operator_info_->Reset(); 261 // Eat up any events caused by |Reset|. 262 dispatcher_.DispatchPendingEvents(); 263 VerifyNoMatch(); 264 } 265 266 // Use these wrappers to send updates to |operator_info_|. These wrappers 267 // optionally run the dispatcher if we want strict checking of the number of 268 // events raised. 269 void UpdateMCCMNC(const std::string& mccmnc) { 270 operator_info_->UpdateMCCMNC(mccmnc); 271 DispatchPendingEventsIfStrict(); 272 } 273 274 void UpdateSID(const std::string& sid) { 275 operator_info_->UpdateSID(sid); 276 DispatchPendingEventsIfStrict(); 277 } 278 279 void UpdateIMSI(const std::string& imsi) { 280 operator_info_->UpdateIMSI(imsi); 281 DispatchPendingEventsIfStrict(); 282 } 283 284 void UpdateICCID(const std::string& iccid) { 285 operator_info_->UpdateICCID(iccid); 286 DispatchPendingEventsIfStrict(); 287 } 288 289 void UpdateNID(const std::string& nid) { 290 operator_info_->UpdateNID(nid); 291 DispatchPendingEventsIfStrict(); 292 } 293 294 void UpdateOperatorName(const std::string& operator_name) { 295 operator_info_->UpdateOperatorName(operator_name); 296 DispatchPendingEventsIfStrict(); 297 } 298 299 void UpdateOnlinePortal(const std::string& url, 300 const std::string& method, 301 const std::string& post_data) { 302 operator_info_->UpdateOnlinePortal(url, method, post_data); 303 DispatchPendingEventsIfStrict(); 304 } 305 306 void DispatchPendingEventsIfStrict() { 307 if (event_checking_policy_ == kEventCheckingPolicyStrict) { 308 dispatcher_.DispatchPendingEvents(); 309 } 310 } 311 312 // /////////////////////////////////////////////////////////////////////////// 313 // Data. 314 MockMobileOperatorInfoObserver observer_; 315 const EventCheckingPolicy event_checking_policy_; 316 317 private: 318 DISALLOW_COPY_AND_ASSIGN(MobileOperatorInfoMainTest); 319 }; 320 321 TEST_P(MobileOperatorInfoMainTest, InitialConditions) { 322 // - Initialize a new object. 323 // - Verify that all initial values of properties are reasonable. 324 EXPECT_FALSE(operator_info_->IsMobileNetworkOperatorKnown()); 325 EXPECT_FALSE(operator_info_->IsMobileVirtualNetworkOperatorKnown()); 326 EXPECT_TRUE(operator_info_->uuid().empty()); 327 EXPECT_TRUE(operator_info_->operator_name().empty()); 328 EXPECT_TRUE(operator_info_->country().empty()); 329 EXPECT_TRUE(operator_info_->mccmnc().empty()); 330 EXPECT_TRUE(operator_info_->sid().empty()); 331 EXPECT_TRUE(operator_info_->nid().empty()); 332 EXPECT_TRUE(operator_info_->mccmnc_list().empty()); 333 EXPECT_TRUE(operator_info_->sid_list().empty()); 334 EXPECT_TRUE(operator_info_->operator_name_list().empty()); 335 EXPECT_TRUE(operator_info_->apn_list().empty()); 336 EXPECT_TRUE(operator_info_->olp_list().empty()); 337 EXPECT_TRUE(operator_info_->activation_code().empty()); 338 EXPECT_FALSE(operator_info_->requires_roaming()); 339 } 340 341 TEST_P(MobileOperatorInfoMainTest, MNOByMCCMNC) { 342 // message: Has an MNO with no MVNO. 343 // match by: MCCMNC. 344 // verify: Observer event, uuid. 345 346 ExpectEventCount(0); 347 UpdateMCCMNC("101999"); // No match. 348 VerifyEventCount(); 349 VerifyNoMatch(); 350 351 ExpectEventCount(1); 352 UpdateMCCMNC("101001"); 353 VerifyEventCount(); 354 VerifyMNOWithUUID("uuid101"); 355 356 ExpectEventCount(1); 357 UpdateMCCMNC("101999"); 358 VerifyEventCount(); 359 VerifyNoMatch(); 360 } 361 362 TEST_P(MobileOperatorInfoMainTest, MNOByMCCMNCMultipleMCCMNCOptions) { 363 // message: Has an MNO with no MCCMNC. 364 // match by: One of the MCCMNCs of the multiple ones in the MNO. 365 // verify: Observer event, uuid. 366 ExpectEventCount(1); 367 UpdateMCCMNC("102002"); 368 VerifyEventCount(); 369 VerifyMNOWithUUID("uuid102"); 370 } 371 372 TEST_P(MobileOperatorInfoMainTest, MNOByMCCMNCMultipleMNOOptions) { 373 // message: Two messages with the same MCCMNC. 374 // match by: Both MNOs matched, one is earmarked. 375 // verify: The earmarked MNO is picked. 376 ExpectEventCount(1); 377 UpdateMCCMNC("124001"); 378 VerifyEventCount(); 379 VerifyMNOWithUUID("uuid124002"); 380 } 381 382 TEST_P(MobileOperatorInfoMainTest, MNOByOperatorName) { 383 // message: Has an MNO with no MVNO. 384 // match by: OperatorName. 385 // verify: Observer event, uuid. 386 ExpectEventCount(0); 387 UpdateOperatorName("name103999"); // No match. 388 VerifyEventCount(); 389 VerifyNoMatch(); 390 391 ExpectEventCount(1); 392 UpdateOperatorName("name103"); 393 VerifyEventCount(); 394 VerifyMNOWithUUID("uuid103"); 395 396 ExpectEventCount(1); 397 UpdateOperatorName("name103999"); // No match. 398 VerifyEventCount(); 399 VerifyNoMatch(); 400 } 401 402 TEST_P(MobileOperatorInfoMainTest, MNOByOperatorNameMultipleMNOOptions) { 403 // message: Two messages with the same operator name. 404 // match by: Both MNOs matched, one is earmarked. 405 // verify: The earmarked MNO is picked. 406 ExpectEventCount(1); 407 UpdateOperatorName("name125001"); 408 VerifyEventCount(); 409 VerifyMNOWithUUID("uuid125002"); 410 } 411 412 TEST_P(MobileOperatorInfoMainTest, MNOByOperatorNameAggressiveMatch) { 413 // These network operators match by name but only after normalizing the names. 414 // Both the name from the database and the name provided to 415 // |UpdateOperatoName| must be normalized for this test to pass. 416 ExpectEventCount(1); 417 UpdateOperatorName("name126001 casedoesnotmatch"); 418 VerifyEventCount(); 419 VerifyMNOWithUUID("uuid126001"); 420 421 ResetOperatorInfo(); 422 ExpectEventCount(1); 423 UpdateOperatorName("name126002 CaseStillDoesNotMatch"); 424 VerifyEventCount(); 425 VerifyMNOWithUUID("uuid126002"); 426 427 ResetOperatorInfo(); 428 ExpectEventCount(1); 429 UpdateOperatorName("name126003GiveMeMoreSpace"); 430 VerifyEventCount(); 431 VerifyMNOWithUUID("uuid126003"); 432 433 ResetOperatorInfo(); 434 ExpectEventCount(1); 435 UpdateOperatorName("name126004 Too Much Air Here"); 436 VerifyEventCount(); 437 VerifyMNOWithUUID("uuid126004"); 438 439 ResetOperatorInfo(); 440 ExpectEventCount(1); 441 UpdateOperatorName("nmwithNon-ii"); 442 VerifyEventCount(); 443 VerifyMNOWithUUID("uuid126005"); 444 } 445 446 TEST_P(MobileOperatorInfoMainTest, MNOByOperatorNameWithLang) { 447 // message: Has an MNO with no MVNO. 448 // match by: OperatorName. 449 // verify: Observer event, fields. 450 ExpectEventCount(1); 451 UpdateOperatorName("name105"); 452 VerifyEventCount(); 453 VerifyMNOWithUUID("uuid105"); 454 } 455 456 TEST_P(MobileOperatorInfoMainTest, MNOByOperatorNameMultipleNameOptions) { 457 // message: Has an MNO with no MVNO. 458 // match by: OperatorName, one of the multiple present in the MNO. 459 // verify: Observer event, fields. 460 ExpectEventCount(1); 461 UpdateOperatorName("name104002"); 462 VerifyEventCount(); 463 VerifyMNOWithUUID("uuid104"); 464 } 465 466 TEST_P(MobileOperatorInfoMainTest, MNOByMCCMNCAndOperatorName) { 467 // message: Has MNOs with no MVNO. 468 // match by: MCCMNC finds two candidates (first one is chosen), Name narrows 469 // down to one. 470 // verify: Observer event, fields. 471 // This is merely a MCCMNC update. 472 ExpectEventCount(1); 473 UpdateMCCMNC("106001"); 474 VerifyEventCount(); 475 VerifyMNOWithUUID("uuid106001"); 476 477 ExpectEventCount(1); 478 UpdateOperatorName("name106002"); 479 VerifyEventCount(); 480 VerifyMNOWithUUID("uuid106002"); 481 482 ResetOperatorInfo(); 483 // Try updates in reverse order. 484 ExpectEventCount(1); 485 UpdateOperatorName("name106001"); 486 VerifyEventCount(); 487 VerifyMNOWithUUID("uuid106001"); 488 } 489 490 TEST_P(MobileOperatorInfoMainTest, MNOByOperatorNameAndMCCMNC) { 491 // message: Has MNOs with no MVNO. 492 // match by: OperatorName finds two (first one is chosen), MCCMNC narrows down 493 // to one. 494 // verify: Observer event, fields. 495 // This is merely an OperatorName update. 496 ExpectEventCount(1); 497 UpdateOperatorName("name107"); 498 VerifyEventCount(); 499 VerifyMNOWithUUID("uuid107001"); 500 501 ExpectEventCount(1); 502 UpdateMCCMNC("107002"); 503 VerifyEventCount(); 504 VerifyMNOWithUUID("uuid107002"); 505 506 ResetOperatorInfo(); 507 // Try updates in reverse order. 508 ExpectEventCount(1); 509 UpdateMCCMNC("107001"); 510 VerifyEventCount(); 511 VerifyMNOWithUUID("uuid107001"); 512 } 513 514 TEST_P(MobileOperatorInfoMainTest, MNOByMCCMNCOverridesOperatorName) { 515 // message: Has MNOs with no MVNO. 516 // match by: First MCCMNC finds one. Then, OperatorName matches another. 517 // verify: MCCMNC match prevails. No change on OperatorName update. 518 ExpectEventCount(1); 519 UpdateMCCMNC("108001"); 520 VerifyEventCount(); 521 VerifyMNOWithUUID("uuid108001"); 522 523 // An event is sent for the updated OperatorName. 524 ExpectEventCount(1); 525 UpdateOperatorName("name108002"); // Does not match. 526 VerifyEventCount(); 527 VerifyMNOWithUUID("uuid108001"); 528 // OperatorName from the database is given preference over the user supplied 529 // one. 530 EXPECT_EQ("name108001", operator_info_->operator_name()); 531 532 ResetOperatorInfo(); 533 // message: Same as above. 534 // match by: First OperatorName finds one, then MCCMNC overrides it. 535 // verify: Two events, MCCMNC one overriding the OperatorName one. 536 ExpectEventCount(1); 537 UpdateOperatorName("name108001"); 538 VerifyEventCount(); 539 VerifyMNOWithUUID("uuid108001"); 540 541 ExpectEventCount(1); 542 UpdateMCCMNC("108002"); 543 VerifyEventCount(); 544 VerifyMNOWithUUID("uuid108002"); 545 EXPECT_EQ("name108002", operator_info_->operator_name()); 546 547 // message: Same as above. 548 // match by: First a *wrong* MCCMNC update, followed by the correct Name 549 // update. 550 // verify: No MNO, since MCCMNC is given precedence. 551 ResetOperatorInfo(); 552 ExpectEventCount(0); 553 UpdateMCCMNC("108999"); // Does not match. 554 UpdateOperatorName("name108001"); 555 VerifyEventCount(); 556 VerifyNoMatch(); 557 } 558 559 TEST_P(MobileOperatorInfoMainTest, MNOByIMSI) { 560 // message: Has MNO with no MVNO. 561 // match by: MCCMNC part of IMSI of length 5 / 6. 562 ExpectEventCount(0); 563 UpdateIMSI("109"); // Too short. 564 VerifyEventCount(); 565 VerifyNoMatch(); 566 567 ExpectEventCount(0); 568 UpdateIMSI("109995432154321"); // No match. 569 VerifyEventCount(); 570 VerifyNoMatch(); 571 572 ResetOperatorInfo(); 573 // Short MCCMNC match. 574 ExpectEventCount(1); 575 UpdateIMSI("109015432154321"); // First 5 digits match. 576 VerifyEventCount(); 577 VerifyMNOWithUUID("uuid10901"); 578 579 ResetOperatorInfo(); 580 // Long MCCMNC match. 581 ExpectEventCount(1); 582 UpdateIMSI("10900215432154321"); // First 6 digits match. 583 VerifyEventCount(); 584 VerifyMNOWithUUID("uuid109002"); 585 } 586 587 TEST_P(MobileOperatorInfoMainTest, MNOByMCCMNCOverridesIMSI) { 588 // message: Has MNOs with no MVNO. 589 // match by: One matches MCCMNC, then one matches a different MCCMNC substring 590 // of IMSI 591 // verify: Observer event for the first match, all fields. Second Update 592 // ignored. 593 ExpectEventCount(1); 594 UpdateMCCMNC("110001"); 595 VerifyEventCount(); 596 VerifyMNOWithUUID("uuid110001"); 597 598 // MNO remains unchanged on a mismatched IMSI update. 599 ExpectEventCount(0); 600 UpdateIMSI("1100025432154321"); // First 6 digits match. 601 VerifyEventCount(); 602 VerifyMNOWithUUID("uuid110001"); 603 604 // MNO remains uncnaged on an invalid IMSI update. 605 ExpectEventCount(0); 606 UpdateIMSI("1100035432154321"); // Prefix does not match. 607 VerifyEventCount(); 608 VerifyMNOWithUUID("uuid110001"); 609 610 ExpectEventCount(0); 611 UpdateIMSI("110"); // Too small. 612 VerifyEventCount(); 613 VerifyMNOWithUUID("uuid110001"); 614 615 ResetOperatorInfo(); 616 // Same as above, but this time, match with IMSI, followed by a contradictory 617 // MCCMNC update. The second update should override the first one. 618 ExpectEventCount(1); 619 UpdateIMSI("1100025432154321"); // First 6 digits match. 620 VerifyEventCount(); 621 VerifyMNOWithUUID("uuid110002"); 622 623 ExpectEventCount(1); 624 UpdateMCCMNC("110001"); 625 VerifyEventCount(); 626 VerifyMNOWithUUID("uuid110001"); 627 } 628 629 TEST_P(MobileOperatorInfoMainTest, MNOUchangedBySecondaryUpdates) { 630 // This test verifies that only some updates affect the MNO. 631 // message: Has MNOs with no MVNO. 632 // match by: First matches the MCCMNC. Later, MNOs with a different MCCMNC 633 // matchs the given SID, NID, ICCID. 634 // verify: Only one Observer event, on the first MCCMNC match. 635 ExpectEventCount(1); 636 UpdateMCCMNC("111001"); 637 VerifyEventCount(); 638 VerifyMNOWithUUID("uuid111001"); 639 640 ExpectEventCount(1); // NID change event. 641 UpdateNID("111202"); 642 VerifyEventCount(); 643 VerifyMNOWithUUID("uuid111001"); 644 } 645 646 TEST_P(MobileOperatorInfoMainTest, MVNODefaultMatch) { 647 // message: MNO with one MVNO (no filter). 648 // match by: MNO matches by MCCMNC. 649 // verify: Observer event for MVNO match. Uuid match the MVNO. 650 // second update: ICCID. 651 // verify: No observer event, match remains unchanged. 652 ExpectEventCount(1); 653 UpdateMCCMNC("112001"); 654 VerifyEventCount(); 655 VerifyMVNOWithUUID("uuid112002"); 656 657 ExpectEventCount(0); 658 UpdateICCID("112002"); 659 VerifyEventCount(); 660 VerifyMVNOWithUUID("uuid112002"); 661 } 662 663 TEST_P(MobileOperatorInfoMainTest, MVNONameMatch) { 664 // message: MNO with one MVNO (name filter). 665 // match by: MNO matches by MCCMNC, 666 // MVNO fails to match by fist name update, 667 // then MVNO matches by name. 668 // verify: Two Observer events: MNO followed by MVNO. 669 ExpectEventCount(1); 670 UpdateMCCMNC("113001"); 671 VerifyEventCount(); 672 VerifyMNOWithUUID("uuid113001"); 673 674 ExpectEventCount(1); 675 UpdateOperatorName("name113999"); // No match. 676 VerifyEventCount(); 677 VerifyMNOWithUUID("uuid113001"); 678 // Name from the database is given preference. 679 EXPECT_EQ("name113001", operator_info_->operator_name()); 680 681 ExpectEventCount(1); 682 UpdateOperatorName("name113002"); 683 VerifyEventCount(); 684 VerifyMVNOWithUUID("uuid113002"); 685 EXPECT_EQ("name113002", operator_info_->operator_name()); 686 } 687 688 TEST_P(MobileOperatorInfoMainTest, MVNONameMalformedRegexMatch) { 689 // message: MNO with one MVNO (name filter with a malformed regex). 690 // match by: MNO matches by MCCMNC. 691 // MVNO does not match 692 ExpectEventCount(2); 693 UpdateMCCMNC("114001"); 694 UpdateOperatorName("name["); 695 VerifyEventCount(); 696 VerifyMNOWithUUID("uuid114001"); 697 } 698 699 TEST_P(MobileOperatorInfoMainTest, MVNONameSubexpressionRegexMatch) { 700 // message: MNO with one MVNO (name filter with simple regex). 701 // match by: MNO matches by MCCMNC. 702 // MVNO does not match with a name whose subexpression matches the 703 // regex. 704 ExpectEventCount(2); // One event for just the name update. 705 UpdateMCCMNC("115001"); 706 UpdateOperatorName("name115_ExtraCrud"); 707 VerifyEventCount(); 708 VerifyMNOWithUUID("uuid115001"); 709 710 ResetOperatorInfo(); 711 ExpectEventCount(2); // One event for just the name update. 712 UpdateMCCMNC("115001"); 713 UpdateOperatorName("ExtraCrud_name115"); 714 VerifyEventCount(); 715 VerifyMNOWithUUID("uuid115001"); 716 717 ResetOperatorInfo(); 718 ExpectEventCount(2); // One event for just the name update. 719 UpdateMCCMNC("115001"); 720 UpdateOperatorName("ExtraCrud_name115_ExtraCrud"); 721 VerifyEventCount(); 722 VerifyMNOWithUUID("uuid115001"); 723 724 ResetOperatorInfo(); 725 ExpectEventCount(2); // One event for just the name update. 726 UpdateMCCMNC("115001"); 727 UpdateOperatorName("name_ExtraCrud_115"); 728 VerifyEventCount(); 729 VerifyMNOWithUUID("uuid115001"); 730 731 ResetOperatorInfo(); 732 ExpectEventCount(2); 733 UpdateMCCMNC("115001"); 734 UpdateOperatorName("name115"); 735 VerifyEventCount(); 736 VerifyMVNOWithUUID("uuid115002"); 737 } 738 739 TEST_P(MobileOperatorInfoMainTest, MVNONameRegexMatch) { 740 // message: MNO with one MVNO (name filter with non-trivial regex). 741 // match by: MNO matches by MCCMNC. 742 // MVNO fails to match several times with different strings. 743 // MVNO matches several times with different values. 744 745 // Make sure we're not taking the regex literally! 746 ExpectEventCount(2); 747 UpdateMCCMNC("116001"); 748 UpdateOperatorName("name[a-zA-Z_]*116[0-9]{0,3}"); 749 VerifyEventCount(); 750 VerifyMNOWithUUID("uuid116001"); 751 752 ResetOperatorInfo(); 753 ExpectEventCount(2); 754 UpdateMCCMNC("116001"); 755 UpdateOperatorName("name[a-zA-Z_]116[0-9]"); 756 VerifyEventCount(); 757 VerifyMNOWithUUID("uuid116001"); 758 759 ResetOperatorInfo(); 760 ExpectEventCount(2); 761 UpdateMCCMNC("116001"); 762 UpdateOperatorName("nameb*1167"); 763 VerifyEventCount(); 764 VerifyMNOWithUUID("uuid116001"); 765 766 // Success! 767 ResetOperatorInfo(); 768 ExpectEventCount(2); 769 UpdateMCCMNC("116001"); 770 UpdateOperatorName("name116"); 771 VerifyEventCount(); 772 VerifyMVNOWithUUID("uuid116002"); 773 774 ResetOperatorInfo(); 775 ExpectEventCount(2); 776 UpdateMCCMNC("116001"); 777 UpdateOperatorName("nameSomeWord116"); 778 VerifyEventCount(); 779 VerifyMVNOWithUUID("uuid116002"); 780 781 ResetOperatorInfo(); 782 ExpectEventCount(2); 783 UpdateMCCMNC("116001"); 784 UpdateOperatorName("name116567"); 785 VerifyEventCount(); 786 VerifyMVNOWithUUID("uuid116002"); 787 } 788 789 TEST_P(MobileOperatorInfoMainTest, MVNONameMatchMultipleFilters) { 790 // message: MNO with one MVNO with two name filters. 791 // match by: MNO matches by MCCMNC. 792 // MVNO first fails on the second filter alone. 793 // MVNO fails on the first filter alone. 794 // MVNO matches on both filters. 795 ExpectEventCount(2); 796 UpdateMCCMNC("117001"); 797 UpdateOperatorName("nameA_crud"); 798 VerifyEventCount(); 799 VerifyMNOWithUUID("uuid117001"); 800 801 ResetOperatorInfo(); 802 ExpectEventCount(2); 803 UpdateMCCMNC("117001"); 804 UpdateOperatorName("crud_nameB"); 805 VerifyEventCount(); 806 VerifyMNOWithUUID("uuid117001"); 807 808 ResetOperatorInfo(); 809 ExpectEventCount(2); 810 UpdateMCCMNC("117001"); 811 UpdateOperatorName("crud_crud"); 812 VerifyEventCount(); 813 VerifyMNOWithUUID("uuid117001"); 814 815 ResetOperatorInfo(); 816 ExpectEventCount(2); 817 UpdateMCCMNC("117001"); 818 UpdateOperatorName("nameA_nameB"); 819 VerifyEventCount(); 820 VerifyMVNOWithUUID("uuid117002"); 821 } 822 823 TEST_P(MobileOperatorInfoMainTest, MVNOIMSIMatch) { 824 // message: MNO with one MVNO (imsi filter). 825 // match by: MNO matches by MCCMNC, 826 // MVNO fails to match by fist imsi update, 827 // then MVNO matches by imsi. 828 // verify: Two Observer events: MNO followed by MVNO. 829 ExpectEventCount(1); 830 UpdateMCCMNC("118001"); 831 VerifyEventCount(); 832 VerifyMNOWithUUID("uuid118001"); 833 834 ExpectEventCount(0); 835 UpdateIMSI("1180011234512345"); // No match. 836 VerifyEventCount(); 837 VerifyMNOWithUUID("uuid118001"); 838 839 ExpectEventCount(1); 840 UpdateIMSI("1180015432154321"); 841 VerifyEventCount(); 842 VerifyMVNOWithUUID("uuid118002"); 843 } 844 845 TEST_P(MobileOperatorInfoMainTest, MVNOICCIDMatch) { 846 // message: MNO with one MVNO (iccid filter). 847 // match by: MNO matches by MCCMNC, 848 // MVNO fails to match by fist iccid update, 849 // then MVNO matches by iccid. 850 // verify: Two Observer events: MNO followed by MVNO. 851 ExpectEventCount(1); 852 UpdateMCCMNC("119001"); 853 VerifyEventCount(); 854 VerifyMNOWithUUID("uuid119001"); 855 856 ExpectEventCount(0); 857 UpdateICCID("119987654321"); // No match. 858 VerifyEventCount(); 859 VerifyMNOWithUUID("uuid119001"); 860 861 ExpectEventCount(1); 862 UpdateICCID("119123456789"); 863 VerifyEventCount(); 864 VerifyMVNOWithUUID("uuid119002"); 865 } 866 867 TEST_P(MobileOperatorInfoMainTest, MVNOSIDMatch) { 868 // message: MNO with one MVNO (sid filter). 869 // match by: MNO matches by SID, 870 // MVNO fails to match by fist sid update, 871 // then MVNO matches by sid. 872 // verify: Two Observer events: MNO followed by MVNO. 873 ExpectEventCount(0); 874 UpdateSID("120999"); // No match. 875 VerifyEventCount(); 876 VerifyNoMatch(); 877 878 ExpectEventCount(1); 879 UpdateSID("120001"); // Only MNO matches. 880 VerifyEventCount(); 881 VerifyMNOWithUUID("uuid120001"); 882 EXPECT_EQ("120001", operator_info_->sid()); 883 884 ExpectEventCount(1); 885 UpdateSID("120002"); // MVNO matches as well. 886 VerifyEventCount(); 887 VerifyMVNOWithUUID("uuid120002"); 888 EXPECT_EQ("120002", operator_info_->sid()); 889 } 890 891 TEST_P(MobileOperatorInfoMainTest, MVNOAllMatch) { 892 // message: MNO with following MVNOS: 893 // - one with no filter. 894 // - one with name filter. 895 // - one with imsi filter. 896 // - one with iccid filter. 897 // - one with name and iccid filter. 898 // verify: 899 // - initial MCCMNC matches the default MVNO directly (not MNO) 900 // - match each of the MVNOs in turn. 901 // - give super set information that does not match any MVNO correctly, 902 // verify that the MNO matches. 903 ExpectEventCount(1); 904 UpdateMCCMNC("121001"); 905 VerifyEventCount(); 906 VerifyMNOWithUUID("uuid121001"); 907 908 ResetOperatorInfo(); 909 ExpectEventCount(2); 910 UpdateMCCMNC("121001"); 911 UpdateOperatorName("name121003"); 912 VerifyEventCount(); 913 VerifyMVNOWithUUID("uuid121003"); 914 915 ResetOperatorInfo(); 916 ExpectEventCount(2); 917 UpdateMCCMNC("121001"); 918 UpdateIMSI("1210045432154321"); 919 VerifyEventCount(); 920 VerifyMVNOWithUUID("uuid121004"); 921 922 ResetOperatorInfo(); 923 ExpectEventCount(2); 924 UpdateMCCMNC("121001"); 925 UpdateICCID("121005123456789"); 926 VerifyEventCount(); 927 VerifyMVNOWithUUID("uuid121005"); 928 929 ResetOperatorInfo(); 930 ExpectEventCount(3); 931 UpdateMCCMNC("121001"); 932 UpdateOperatorName("name121006"); 933 VerifyMNOWithUUID("uuid121001"); 934 UpdateICCID("121006123456789"); 935 VerifyEventCount(); 936 VerifyMVNOWithUUID("uuid121006"); 937 } 938 939 TEST_P(MobileOperatorInfoMainTest, MVNOMatchAndMismatch) { 940 // message: MNO with one MVNO with name filter. 941 // match by: MNO matches by MCCMNC 942 // MVNO matches by name. 943 // Second name update causes the MVNO to not match again. 944 ExpectEventCount(1); 945 UpdateMCCMNC("113001"); 946 VerifyEventCount(); 947 VerifyMNOWithUUID("uuid113001"); 948 949 ExpectEventCount(1); 950 UpdateOperatorName("name113002"); 951 VerifyEventCount(); 952 VerifyMVNOWithUUID("uuid113002"); 953 EXPECT_EQ("name113002", operator_info_->operator_name()); 954 955 ExpectEventCount(1); 956 UpdateOperatorName("name113999"); // No match. 957 VerifyEventCount(); 958 VerifyMNOWithUUID("uuid113001"); 959 // Name from database is given preference. 960 EXPECT_EQ("name113001", operator_info_->operator_name()); 961 } 962 963 TEST_P(MobileOperatorInfoMainTest, MVNOMatchAndReset) { 964 // message: MVNO with name filter. 965 // verify; 966 // - match MVNO by name. 967 // - Reset object, verify Observer event, and not match. 968 // - match MVNO by name again. 969 ExpectEventCount(1); 970 UpdateMCCMNC("113001"); 971 VerifyEventCount(); 972 ExpectEventCount(1); 973 VerifyMNOWithUUID("uuid113001"); 974 UpdateOperatorName("name113002"); 975 VerifyEventCount(); 976 VerifyMVNOWithUUID("uuid113002"); 977 EXPECT_EQ("name113002", operator_info_->operator_name()); 978 979 ExpectEventCount(1); 980 operator_info_->Reset(); 981 VerifyEventCount(); 982 VerifyNoMatch(); 983 984 ExpectEventCount(1); 985 UpdateMCCMNC("113001"); 986 VerifyEventCount(); 987 VerifyMNOWithUUID("uuid113001"); 988 ExpectEventCount(1); 989 UpdateOperatorName("name113002"); 990 VerifyEventCount(); 991 VerifyMVNOWithUUID("uuid113002"); 992 EXPECT_EQ("name113002", operator_info_->operator_name()); 993 } 994 995 // Here, we rely on our knowledge about the implementation: The SID and MCCMNC 996 // updates follow the same code paths, and so we can get away with not testing 997 // all the scenarios we test above for MCCMNC. Instead, we only do basic testing 998 // to make sure that SID upates operator as MCCMNC updates do. 999 TEST_P(MobileOperatorInfoMainTest, MNOBySID) { 1000 // message: Has an MNO with no MVNO. 1001 // match by: SID. 1002 // verify: Observer event, uuid. 1003 1004 ExpectEventCount(0); 1005 UpdateSID("1229"); // No match. 1006 VerifyEventCount(); 1007 VerifyNoMatch(); 1008 1009 ExpectEventCount(1); 1010 UpdateSID("1221"); 1011 VerifyEventCount(); 1012 VerifyMNOWithUUID("uuid1221"); 1013 1014 ExpectEventCount(1); 1015 UpdateSID("1229"); // No Match. 1016 VerifyEventCount(); 1017 VerifyNoMatch(); 1018 } 1019 1020 TEST_P(MobileOperatorInfoMainTest, MNOByMCCMNCAndSID) { 1021 // message: Has an MNO with no MVNO. 1022 // match by: SID / MCCMNC alternately. 1023 // verify: Observer event, uuid. 1024 1025 ExpectEventCount(0); 1026 UpdateMCCMNC("123999"); // NO match. 1027 UpdateSID("1239"); // No match. 1028 VerifyEventCount(); 1029 VerifyNoMatch(); 1030 1031 ExpectEventCount(1); 1032 UpdateMCCMNC("123001"); 1033 VerifyEventCount(); 1034 VerifyMNOWithUUID("uuid123001"); 1035 1036 ExpectEventCount(1); 1037 operator_info_->Reset(); 1038 VerifyEventCount(); 1039 VerifyNoMatch(); 1040 1041 ExpectEventCount(1); 1042 UpdateSID("1232"); 1043 VerifyEventCount(); 1044 VerifyMNOWithUUID("uuid1232"); 1045 1046 ExpectEventCount(1); 1047 operator_info_->Reset(); 1048 VerifyEventCount(); 1049 VerifyNoMatch(); 1050 1051 ExpectEventCount(1); 1052 UpdateMCCMNC("123001"); 1053 VerifyEventCount(); 1054 VerifyMNOWithUUID("uuid123001"); 1055 } 1056 1057 class MobileOperatorInfoDataTest : public MobileOperatorInfoMainTest { 1058 public: 1059 MobileOperatorInfoDataTest() : MobileOperatorInfoMainTest() {} 1060 1061 // Same as MobileOperatorInfoMainTest, except that the database used is 1062 // different. 1063 virtual void SetUp() { 1064 operator_info_->ClearDatabasePaths(); 1065 AddDatabase(mobile_operator_db::data_test, 1066 arraysize(mobile_operator_db::data_test)); 1067 operator_info_->Init(); 1068 operator_info_->AddObserver(&observer_); 1069 } 1070 1071 protected: 1072 // This is a function that does a best effort verification of the information 1073 // that is obtained from the database by the MobileOperatorInfo object against 1074 // expectations stored in the form of data members in this class. 1075 // This is not a full proof check. In particular: 1076 // - It is unspecified in some case which of the values from a list is 1077 // exposed as a property. For example, at best, we can check that |sid| is 1078 // non-empty. 1079 // - It is not robust to "" as property values at times. 1080 void VerifyDatabaseData() { 1081 EXPECT_EQ(country_, operator_info_->country()); 1082 EXPECT_EQ(requires_roaming_, operator_info_->requires_roaming()); 1083 EXPECT_EQ(activation_code_, operator_info_->activation_code()); 1084 1085 EXPECT_EQ(mccmnc_list_.size(), operator_info_->mccmnc_list().size()); 1086 set<string> mccmnc_set(operator_info_->mccmnc_list().begin(), 1087 operator_info_->mccmnc_list().end()); 1088 for (const auto& mccmnc : mccmnc_list_) { 1089 EXPECT_TRUE(mccmnc_set.find(mccmnc) != mccmnc_set.end()); 1090 } 1091 if (mccmnc_list_.size() > 0) { 1092 // It is not specified which entry will be chosen, but mccmnc() must be 1093 // non empty. 1094 EXPECT_FALSE(operator_info_->mccmnc().empty()); 1095 } 1096 1097 VerifyNameListsMatch(operator_name_list_, 1098 operator_info_->operator_name_list()); 1099 1100 // This comparison breaks if two apns have the same |apn| field. 1101 EXPECT_EQ(apn_list_.size(), operator_info_->apn_list().size()); 1102 map<string, const MobileOperatorInfo::MobileAPN*> mobile_apns; 1103 for (const auto& apn_node : operator_info_->apn_list()) { 1104 mobile_apns[apn_node->apn] = apn_node; 1105 } 1106 for (const auto& apn_lhs : apn_list_) { 1107 ASSERT_TRUE(mobile_apns.find(apn_lhs->apn) != mobile_apns.end()); 1108 const auto& apn_rhs = mobile_apns[apn_lhs->apn]; 1109 // Only comparing apn, name, username, password. 1110 EXPECT_EQ(apn_lhs->apn, apn_rhs->apn); 1111 EXPECT_EQ(apn_lhs->username, apn_rhs->username); 1112 EXPECT_EQ(apn_lhs->password, apn_rhs->password); 1113 VerifyNameListsMatch(apn_lhs->operator_name_list, 1114 apn_rhs->operator_name_list); 1115 } 1116 1117 EXPECT_EQ(olp_list_.size(), operator_info_->olp_list().size()); 1118 // This comparison breaks if two OLPs have the same |url|. 1119 map<string, MobileOperatorInfo::OnlinePortal> olps; 1120 for (const auto& olp : operator_info_->olp_list()) { 1121 olps[olp.url] = olp; 1122 } 1123 for (const auto& olp : olp_list_) { 1124 ASSERT_TRUE(olps.find(olp.url) != olps.end()); 1125 const auto& olp_rhs = olps[olp.url]; 1126 EXPECT_EQ(olp.method, olp_rhs.method); 1127 EXPECT_EQ(olp.post_data, olp_rhs.post_data); 1128 } 1129 1130 EXPECT_EQ(sid_list_.size(), operator_info_->sid_list().size()); 1131 set<string> sid_set(operator_info_->sid_list().begin(), 1132 operator_info_->sid_list().end()); 1133 for (const auto& sid : sid_list_) { 1134 EXPECT_TRUE(sid_set.find(sid) != sid_set.end()); 1135 } 1136 if (sid_list_.size() > 0) { 1137 // It is not specified which entry will be chosen, but |sid()| must be 1138 // non-empty. 1139 EXPECT_FALSE(operator_info_->sid().empty()); 1140 } 1141 } 1142 1143 // This function does some extra checks for the user data that can not be done 1144 // when data is obtained from the database. 1145 void VerifyUserData() { 1146 EXPECT_EQ(sid_, operator_info_->sid()); 1147 } 1148 1149 void VerifyNameListsMatch( 1150 const vector<MobileOperatorInfo::LocalizedName>& operator_name_list_lhs, 1151 const vector<MobileOperatorInfo::LocalizedName>& operator_name_list_rhs) { 1152 // This comparison breaks if two localized names have the same |name|. 1153 map<string, MobileOperatorInfo::LocalizedName> localized_names; 1154 for (const auto& localized_name : operator_name_list_rhs) { 1155 localized_names[localized_name.name] = localized_name; 1156 } 1157 for (const auto& localized_name : operator_name_list_lhs) { 1158 EXPECT_TRUE(localized_names.find(localized_name.name) != 1159 localized_names.end()); 1160 EXPECT_EQ(localized_name.language, 1161 localized_names[localized_name.name].language); 1162 } 1163 } 1164 1165 // Use this function to pre-popluate all the data members of this object with 1166 // values matching the MNO for the database in |data_test.prototxt|. 1167 void PopulateMNOData() { 1168 country_ = "us"; 1169 requires_roaming_ = true; 1170 activation_code_ = "open sesame"; 1171 1172 mccmnc_list_.clear(); 1173 mccmnc_list_.push_back("200001"); 1174 mccmnc_list_.push_back("200002"); 1175 mccmnc_list_.push_back("200003"); 1176 1177 operator_name_list_.clear(); 1178 operator_name_list_.push_back({"name200001", "en"}); 1179 operator_name_list_.push_back({"name200002", ""}); 1180 1181 apn_list_.clear(); 1182 MobileOperatorInfo::MobileAPN* apn; 1183 apn = new MobileOperatorInfo::MobileAPN(); 1184 apn->apn = "test (at) test.com"; 1185 apn->username = "testuser"; 1186 apn->password = "is_public_boohoohoo"; 1187 apn->operator_name_list.push_back({"name200003", "hi"}); 1188 apn_list_.push_back(apn); // Takes ownership. 1189 1190 olp_list_.clear(); 1191 olp_list_.push_back({"some (at) random.com", "POST", "random_data"}); 1192 1193 sid_list_.clear(); 1194 sid_list_.push_back("200123"); 1195 sid_list_.push_back("200234"); 1196 sid_list_.push_back("200345"); 1197 } 1198 1199 // Use this function to pre-populate all the data members of this object with 1200 // values matching the MVNO for the database in |data_test.prototext|. 1201 void PopulateMVNOData() { 1202 country_ = "ca"; 1203 requires_roaming_ = false; 1204 activation_code_ = "khul ja sim sim"; 1205 1206 mccmnc_list_.clear(); 1207 mccmnc_list_.push_back("200001"); 1208 mccmnc_list_.push_back("200102"); 1209 1210 operator_name_list_.clear(); 1211 operator_name_list_.push_back({"name200101", "en"}); 1212 operator_name_list_.push_back({"name200102", ""}); 1213 1214 apn_list_.clear(); 1215 MobileOperatorInfo::MobileAPN* apn; 1216 apn = new MobileOperatorInfo::MobileAPN(); 1217 apn->apn = "test2 (at) test.com"; 1218 apn->username = "testuser2"; 1219 apn->password = "is_public_boohoohoo_too"; 1220 apn_list_.push_back(apn); // Takes ownership. 1221 1222 olp_list_.clear(); 1223 olp_list_.push_back({"someother (at) random.com", "GET", ""}); 1224 1225 sid_list_.clear(); 1226 sid_list_.push_back("200345"); 1227 } 1228 1229 // Data to be verified against the database. 1230 string country_; 1231 bool requires_roaming_; 1232 string activation_code_; 1233 vector<string> mccmnc_list_; 1234 vector<MobileOperatorInfo::LocalizedName> operator_name_list_; 1235 ScopedVector<MobileOperatorInfo::MobileAPN> apn_list_; 1236 vector<MobileOperatorInfo::OnlinePortal> olp_list_; 1237 vector<string> sid_list_; 1238 1239 // Extra data to be verified only against user updates. 1240 string sid_; 1241 1242 private: 1243 DISALLOW_COPY_AND_ASSIGN(MobileOperatorInfoDataTest); 1244 }; 1245 1246 1247 TEST_P(MobileOperatorInfoDataTest, MNODetailedInformation) { 1248 // message: MNO with all the information filled in. 1249 // match by: MNO matches by MCCMNC 1250 // verify: All information is correctly loaded. 1251 ExpectEventCount(1); 1252 UpdateMCCMNC("200001"); 1253 VerifyEventCount(); 1254 VerifyMNOWithUUID("uuid200001"); 1255 1256 PopulateMNOData(); 1257 VerifyDatabaseData(); 1258 } 1259 1260 TEST_P(MobileOperatorInfoDataTest, MVNOInheritsInformation) { 1261 // message: MVNO with name filter. 1262 // verify: All the missing fields are carried over to the MVNO from MNO. 1263 ExpectEventCount(2); 1264 UpdateMCCMNC("200001"); 1265 UpdateOperatorName("name200201"); 1266 VerifyEventCount(); 1267 VerifyMVNOWithUUID("uuid200201"); 1268 1269 PopulateMNOData(); 1270 VerifyDatabaseData(); 1271 } 1272 1273 TEST_P(MobileOperatorInfoDataTest, MVNOOverridesInformation) { 1274 // match by: MNO matches by MCCMNC, MVNO by name. 1275 // verify: All information is correctly loaded. 1276 // The MVNO in this case overrides the information provided by MNO. 1277 ExpectEventCount(2); 1278 UpdateMCCMNC("200001"); 1279 UpdateOperatorName("name200101"); 1280 VerifyEventCount(); 1281 VerifyMVNOWithUUID("uuid200101"); 1282 1283 PopulateMVNOData(); 1284 VerifyDatabaseData(); 1285 } 1286 1287 TEST_P(MobileOperatorInfoDataTest, NoUpdatesBeforeMNOMatch) { 1288 // message: MVNO. 1289 // - do not match MNO with mccmnc/name 1290 // - on different updates, verify no events. 1291 ExpectEventCount(0); 1292 UpdateMCCMNC("200999"); // No match. 1293 UpdateOperatorName("name200001"); // matches MNO 1294 UpdateOperatorName("name200101"); // matches MVNO filter. 1295 UpdateSID("200999"); // No match. 1296 VerifyEventCount(); 1297 VerifyNoMatch(); 1298 } 1299 1300 TEST_P(MobileOperatorInfoDataTest, UserUpdatesOverrideMVNO) { 1301 // - match MVNO. 1302 // - send updates to properties and verify events are raised and values of 1303 // updated properties override the ones provided by the database. 1304 string imsi {"2009991234512345"}; 1305 string iccid {"200999123456789"}; 1306 string olp_url {"url (at) url.com"}; 1307 string olp_method {"POST"}; 1308 string olp_post_data {"data"}; 1309 1310 // Determine MVNO. 1311 ExpectEventCount(2); 1312 UpdateMCCMNC("200001"); 1313 UpdateOperatorName("name200101"); 1314 VerifyEventCount(); 1315 VerifyMVNOWithUUID("uuid200101"); 1316 1317 // Send updates. 1318 ExpectEventCount(1); 1319 UpdateOnlinePortal(olp_url, olp_method, olp_post_data); 1320 UpdateIMSI(imsi); 1321 // No event raised because imsi is not exposed. 1322 UpdateICCID(iccid); 1323 // No event raised because ICCID is not exposed. 1324 1325 VerifyEventCount(); 1326 1327 // Update our expectations. 1328 PopulateMVNOData(); 1329 olp_list_.push_back({olp_url, olp_method, olp_post_data}); 1330 1331 VerifyDatabaseData(); 1332 } 1333 1334 TEST_P(MobileOperatorInfoDataTest, CachedUserUpdatesOverrideMVNO) { 1335 // message: MVNO. 1336 // - First send updates that don't identify an MNO. 1337 // - Then identify an MNO and MVNO. 1338 // - verify that all the earlier updates are cached, and override the MVNO 1339 // information. 1340 string imsi {"2009991234512345"}; 1341 string iccid {"200999123456789"}; 1342 string sid {"200999"}; 1343 string olp_url {"url (at) url.com"}; 1344 string olp_method {"POST"}; 1345 string olp_post_data {"data"}; 1346 1347 // Send updates. 1348 ExpectEventCount(0); 1349 UpdateSID(sid); 1350 UpdateOnlinePortal(olp_url, olp_method, olp_post_data); 1351 UpdateIMSI(imsi); 1352 UpdateICCID(iccid); 1353 VerifyEventCount(); 1354 1355 // Determine MVNO. 1356 ExpectEventCount(2); 1357 UpdateMCCMNC("200001"); 1358 UpdateOperatorName("name200101"); 1359 VerifyEventCount(); 1360 VerifyMVNOWithUUID("uuid200101"); 1361 1362 // Update our expectations. 1363 PopulateMVNOData(); 1364 sid_ = sid; 1365 sid_list_.push_back(sid); 1366 olp_list_.push_back({olp_url, olp_method, olp_post_data}); 1367 1368 VerifyDatabaseData(); 1369 VerifyUserData(); 1370 } 1371 1372 TEST_P(MobileOperatorInfoDataTest, RedundantUserUpdatesMVNO) { 1373 // - match MVNO. 1374 // - send redundant updates to properties. 1375 // - Verify no events, no updates to properties. 1376 1377 // Identify MVNO. 1378 ExpectEventCount(2); 1379 UpdateMCCMNC("200001"); 1380 UpdateOperatorName("name200101"); 1381 VerifyEventCount(); 1382 VerifyMVNOWithUUID("uuid200101"); 1383 1384 // Send redundant updates. 1385 // TODO(pprabhu) 1386 // |UpdateOnlinePortal| leads to an event because this is the first time this 1387 // value are set *by the user*. Although the values from the database were the 1388 // same, we did not use those values for filters. It would be ideal to not 1389 // raise these redundant events (since no public information about the object 1390 // changed), but I haven't invested in doing so yet. 1391 ExpectEventCount(1); 1392 UpdateOperatorName(operator_info_->operator_name()); 1393 UpdateOnlinePortal("someother (at) random.com", "GET", ""); 1394 VerifyEventCount(); 1395 PopulateMVNOData(); 1396 VerifyDatabaseData(); 1397 } 1398 1399 TEST_P(MobileOperatorInfoDataTest, RedundantCachedUpdatesMVNO) { 1400 // message: MVNO. 1401 // - First send updates that don't identify MVNO, but match the data. 1402 // - Then idenityf an MNO and MVNO. 1403 // - verify that redundant information occurs only once. 1404 1405 // Send redundant updates. 1406 ExpectEventCount(2); 1407 UpdateSID(operator_info_->sid()); 1408 UpdateOperatorName(operator_info_->operator_name()); 1409 UpdateOnlinePortal("someother (at) random.com", "GET", ""); 1410 1411 // Identify MVNO. 1412 UpdateMCCMNC("200001"); 1413 UpdateOperatorName("name200101"); 1414 VerifyEventCount(); 1415 VerifyMVNOWithUUID("uuid200101"); 1416 1417 PopulateMVNOData(); 1418 VerifyDatabaseData(); 1419 } 1420 1421 TEST_P(MobileOperatorInfoDataTest, ResetClearsInformation) { 1422 // Repeatedly reset the object and check M[V]NO identification and data. 1423 ExpectEventCount(2); 1424 UpdateMCCMNC("200001"); 1425 UpdateOperatorName("name200201"); 1426 VerifyEventCount(); 1427 VerifyMVNOWithUUID("uuid200201"); 1428 PopulateMNOData(); 1429 VerifyDatabaseData(); 1430 1431 ExpectEventCount(1); 1432 operator_info_->Reset(); 1433 VerifyEventCount(); 1434 VerifyNoMatch(); 1435 1436 ExpectEventCount(2); 1437 UpdateMCCMNC("200001"); 1438 UpdateOperatorName("name200101"); 1439 VerifyEventCount(); 1440 VerifyMVNOWithUUID("uuid200101"); 1441 PopulateMVNOData(); 1442 VerifyDatabaseData(); 1443 1444 ExpectEventCount(1); 1445 operator_info_->Reset(); 1446 VerifyEventCount(); 1447 VerifyNoMatch(); 1448 1449 ExpectEventCount(1); 1450 UpdateMCCMNC("200001"); 1451 VerifyEventCount(); 1452 VerifyMNOWithUUID("uuid200001"); 1453 PopulateMNOData(); 1454 VerifyDatabaseData(); 1455 } 1456 1457 TEST_P(MobileOperatorInfoDataTest, FilteredOLP) { 1458 // We only check basic filter matching, using the fact that the regex matching 1459 // code is shared with the MVNO filtering, and is already well tested. 1460 // (1) None of the filters match. 1461 ExpectEventCount(1); 1462 UpdateMCCMNC("200001"); 1463 VerifyEventCount(); 1464 VerifyMNOWithUUID("uuid200001"); 1465 1466 ASSERT_EQ(1, operator_info_->olp_list().size()); 1467 // Just check that the filtered OLPs are not in the list. 1468 EXPECT_NE("olp@mccmnc", operator_info_->olp_list()[0].url); 1469 EXPECT_NE("olp@sid", operator_info_->olp_list()[0].url); 1470 1471 // (2) MCCMNC filter matches. 1472 ExpectEventCount(1); 1473 operator_info_->Reset(); 1474 VerifyEventCount(); 1475 VerifyNoMatch(); 1476 1477 ExpectEventCount(1); 1478 UpdateMCCMNC("200003"); 1479 VerifyEventCount(); 1480 VerifyMNOWithUUID("uuid200001"); 1481 1482 ASSERT_EQ(2, operator_info_->olp_list().size()); 1483 EXPECT_NE("olp@sid", operator_info_->olp_list()[0].url); 1484 bool found_olp_by_mccmnc = false; 1485 for (const auto& olp : operator_info_->olp_list()) { 1486 found_olp_by_mccmnc |= ("olp@mccmnc" == olp.url); 1487 } 1488 EXPECT_TRUE(found_olp_by_mccmnc); 1489 1490 // (3) SID filter matches. 1491 ExpectEventCount(1); 1492 operator_info_->Reset(); 1493 VerifyEventCount(); 1494 VerifyNoMatch(); 1495 1496 ExpectEventCount(1); 1497 UpdateSID("200345"); 1498 VerifyEventCount(); 1499 VerifyMNOWithUUID("uuid200001"); 1500 1501 ASSERT_EQ(2, operator_info_->olp_list().size()); 1502 EXPECT_NE("olp@mccmnc", operator_info_->olp_list()[0].url); 1503 bool found_olp_by_sid = false; 1504 for (const auto& olp : operator_info_->olp_list()) { 1505 found_olp_by_sid |= ("olp@sid" == olp.url); 1506 } 1507 EXPECT_TRUE(found_olp_by_sid); 1508 } 1509 1510 class MobileOperatorInfoObserverTest : public MobileOperatorInfoMainTest { 1511 public: 1512 MobileOperatorInfoObserverTest() : MobileOperatorInfoMainTest() {} 1513 1514 // Same as |MobileOperatorInfoMainTest::SetUp|, except that we don't add a 1515 // default observer. 1516 virtual void SetUp() { 1517 operator_info_->ClearDatabasePaths(); 1518 AddDatabase(mobile_operator_db::data_test, 1519 arraysize(mobile_operator_db::data_test)); 1520 operator_info_->Init(); 1521 } 1522 1523 protected: 1524 // /////////////////////////////////////////////////////////////////////////// 1525 // Data. 1526 MockMobileOperatorInfoObserver second_observer_; 1527 1528 private: 1529 DISALLOW_COPY_AND_ASSIGN(MobileOperatorInfoObserverTest); 1530 }; 1531 1532 TEST_P(MobileOperatorInfoObserverTest, NoObserver) { 1533 // - Don't add any observers, and then cause an MVNO update to occur. 1534 // - Verify no crash. 1535 UpdateMCCMNC("200001"); 1536 UpdateOperatorName("name200101"); 1537 } 1538 1539 TEST_P(MobileOperatorInfoObserverTest, MultipleObservers) { 1540 // - Add two observers, and then cause an MVNO update to occur. 1541 // - Verify both observers are notified. 1542 operator_info_->AddObserver(&observer_); 1543 operator_info_->AddObserver(&second_observer_); 1544 1545 EXPECT_CALL(observer_, OnOperatorChanged()).Times(2); 1546 EXPECT_CALL(second_observer_, OnOperatorChanged()).Times(2); 1547 UpdateMCCMNC("200001"); 1548 UpdateOperatorName("name200101"); 1549 VerifyMVNOWithUUID("uuid200101"); 1550 1551 dispatcher_.DispatchPendingEvents(); 1552 } 1553 1554 TEST_P(MobileOperatorInfoObserverTest, LateObserver) { 1555 // - Add one observer, and verify it gets an MVNO update. 1556 operator_info_->AddObserver(&observer_); 1557 1558 EXPECT_CALL(observer_, OnOperatorChanged()).Times(2); 1559 EXPECT_CALL(second_observer_, OnOperatorChanged()).Times(0); 1560 UpdateMCCMNC("200001"); 1561 UpdateOperatorName("name200101"); 1562 VerifyMVNOWithUUID("uuid200101"); 1563 dispatcher_.DispatchPendingEvents(); 1564 Mock::VerifyAndClearExpectations(&observer_); 1565 Mock::VerifyAndClearExpectations(&second_observer_); 1566 1567 EXPECT_CALL(observer_, OnOperatorChanged()).Times(1); 1568 EXPECT_CALL(second_observer_, OnOperatorChanged()).Times(0); 1569 operator_info_->Reset(); 1570 VerifyNoMatch(); 1571 dispatcher_.DispatchPendingEvents(); 1572 Mock::VerifyAndClearExpectations(&observer_); 1573 Mock::VerifyAndClearExpectations(&second_observer_); 1574 1575 // - Add another observer, verify both get an MVNO update. 1576 operator_info_->AddObserver(&second_observer_); 1577 1578 EXPECT_CALL(observer_, OnOperatorChanged()).Times(2); 1579 EXPECT_CALL(second_observer_, OnOperatorChanged()).Times(2); 1580 UpdateMCCMNC("200001"); 1581 UpdateOperatorName("name200101"); 1582 VerifyMVNOWithUUID("uuid200101"); 1583 dispatcher_.DispatchPendingEvents(); 1584 Mock::VerifyAndClearExpectations(&observer_); 1585 Mock::VerifyAndClearExpectations(&second_observer_); 1586 1587 EXPECT_CALL(observer_, OnOperatorChanged()).Times(1); 1588 EXPECT_CALL(second_observer_, OnOperatorChanged()).Times(1); 1589 operator_info_->Reset(); 1590 VerifyNoMatch(); 1591 dispatcher_.DispatchPendingEvents(); 1592 Mock::VerifyAndClearExpectations(&observer_); 1593 Mock::VerifyAndClearExpectations(&second_observer_); 1594 1595 // - Remove an observer, verify it no longer gets updates. 1596 operator_info_->RemoveObserver(&observer_); 1597 1598 EXPECT_CALL(observer_, OnOperatorChanged()).Times(0); 1599 EXPECT_CALL(second_observer_, OnOperatorChanged()).Times(2); 1600 UpdateMCCMNC("200001"); 1601 UpdateOperatorName("name200101"); 1602 VerifyMVNOWithUUID("uuid200101"); 1603 dispatcher_.DispatchPendingEvents(); 1604 Mock::VerifyAndClearExpectations(&observer_); 1605 Mock::VerifyAndClearExpectations(&second_observer_); 1606 1607 EXPECT_CALL(observer_, OnOperatorChanged()).Times(0); 1608 EXPECT_CALL(second_observer_, OnOperatorChanged()).Times(1); 1609 operator_info_->Reset(); 1610 VerifyNoMatch(); 1611 dispatcher_.DispatchPendingEvents(); 1612 Mock::VerifyAndClearExpectations(&observer_); 1613 Mock::VerifyAndClearExpectations(&second_observer_); 1614 } 1615 1616 INSTANTIATE_TEST_CASE_P(MobileOperatorInfoMainTestInstance, 1617 MobileOperatorInfoMainTest, 1618 Values(kEventCheckingPolicyStrict, 1619 kEventCheckingPolicyNonStrict)); 1620 INSTANTIATE_TEST_CASE_P(MobileOperatorInfoDataTestInstance, 1621 MobileOperatorInfoDataTest, 1622 Values(kEventCheckingPolicyStrict, 1623 kEventCheckingPolicyNonStrict)); 1624 // It only makes sense to do strict checking here. 1625 INSTANTIATE_TEST_CASE_P(MobileOperatorInfoObserverTestInstance, 1626 MobileOperatorInfoObserverTest, 1627 Values(kEventCheckingPolicyStrict)); 1628 } // namespace shill 1629