shill: cellular: Use operator ID from SIM as a fallback.

When the serving operator ID is not available, use the operator ID from
SIM as a fallback.

BUG=chromium-os:36158
TEST=Build and run unit tests.

Change-Id: Ie1b4604177d69138162f9834cb65be93a61cae5b
Reviewed-on: https://gerrit.chromium.org/gerrit/37605
Reviewed-by: Darin Petkov <petkov@chromium.org>
Commit-Ready: Ben Chan <benchan@chromium.org>
Tested-by: Ben Chan <benchan@chromium.org>
diff --git a/cellular_capability_universal_unittest.cc b/cellular_capability_universal_unittest.cc
index 20ca0a3..d1a7425 100644
--- a/cellular_capability_universal_unittest.cc
+++ b/cellular_capability_universal_unittest.cc
@@ -932,8 +932,8 @@
   cellular_->cellular_operator_info_ = &cellular_operator_info_;
 
   EXPECT_CALL(cellular_operator_info_, GetOLP(capability_->operator_id_, _))
-      .WillOnce(Invoke(&get_olp_helper,
-                       &MockCellularOperatorInfoGetOLPHelper::GetOLP));
+      .WillRepeatedly(Invoke(&get_olp_helper,
+                             &MockCellularOperatorInfoGetOLPHelper::GetOLP));
 
   SetService();
   capability_->UpdateOLP();
@@ -963,11 +963,58 @@
   EXPECT_EQ(kTestOperator, cellular_->service()->serving_operator().GetName());
 }
 
+TEST_F(CellularCapabilityUniversalTest, UpdateOperatorInfoViaOperatorId) {
+  static const char kOperatorName[] = "Swisscom";
+  static const char kOperatorId[] = "22801";
+  InitProviderDB();
+  capability_->serving_operator_.SetCode("");
+  SetService();
+  capability_->UpdateOperatorInfo();
+  EXPECT_EQ("", capability_->serving_operator_.GetName());
+  EXPECT_EQ("", capability_->serving_operator_.GetCountry());
+  EXPECT_EQ("", cellular_->service()->serving_operator().GetName());
+
+  capability_->operator_id_ = kOperatorId;
+
+  // Service activation is not needed
+  cellular_->cellular_operator_info_ = &cellular_operator_info_;
+  EXPECT_CALL(cellular_operator_info_, GetOLP(_, _))
+      .WillOnce(Return(false));
+  capability_->UpdateOperatorInfo();
+  EXPECT_EQ("", capability_->serving_operator_.GetName());
+  EXPECT_EQ("", capability_->serving_operator_.GetCountry());
+  EXPECT_EQ("", cellular_->service()->serving_operator().GetName());
+
+  // Service activation is needed
+  capability_->mdn_ = "0000000000";
+  cellular_->cellular_operator_info_ = &cellular_operator_info_;
+  EXPECT_CALL(cellular_operator_info_, GetOLP(_, _))
+      .WillOnce(Return(true));
+
+  capability_->UpdateOperatorInfo();
+  EXPECT_EQ(kOperatorId, capability_->serving_operator_.GetCode());
+  EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
+  EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
+  EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
+}
+
 TEST_F(CellularCapabilityUniversalTest, CreateFriendlyServiceName) {
   CellularCapabilityUniversal::friendly_service_name_id_ = 0;
   EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
   EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
 
+  // Service activation is not needed
+  capability_->operator_id_ = "0123";
+  EXPECT_EQ("GSMNetwork2", capability_->CreateFriendlyServiceName());
+
+  // Service activation is needed
+  capability_->mdn_ = "0000000000";
+  cellular_->cellular_operator_info_ = &cellular_operator_info_;
+  EXPECT_CALL(cellular_operator_info_, GetOLP(_, _))
+      .WillOnce(Return(true));
+  EXPECT_EQ("cellular_0123", capability_->CreateFriendlyServiceName());
+  EXPECT_EQ("0123", capability_->serving_operator_.GetCode());
+
   capability_->serving_operator_.SetCode("1234");
   EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());