shill: cellular: Obtain |actvation_code| from serving operator.

In automatic activation implemented in CellularCapabilityUniversalCDMA, obtain
the activation code from the serving operator.

BUG=chromium:376098
TEST=(1) Run shill_unittests
     (2) Run network_CDMAActivate

Change-Id: Id56dcd99625ad2d655e58b68090a17febb7a56f9
Reviewed-on: https://chromium-review.googlesource.com/201084
Reviewed-by: Ben Chan <benchan@chromium.org>
Commit-Queue: Prathmesh Prabhu <pprabhu@chromium.org>
Tested-by: Prathmesh Prabhu <pprabhu@chromium.org>
diff --git a/cellular_capability_universal_cdma.cc b/cellular_capability_universal_cdma.cc
index 3d6f65d..dd925f3 100644
--- a/cellular_capability_universal_cdma.cc
+++ b/cellular_capability_universal_cdma.cc
@@ -92,11 +92,13 @@
 }
 
 void CellularCapabilityUniversalCDMA::ActivateAutomatic() {
-  if (activation_code_.empty()) {
+  if (!cellular()->serving_operator_info()->IsMobileNetworkOperatorKnown() ||
+      cellular()->serving_operator_info()->activation_code().empty()) {
     SLOG(Cellular, 2) << "OTA activation cannot be run in the presence of no "
                       << "activation code.";
     return;
   }
+
   PendingActivationStore::State state =
       modem_info()->pending_activation_store()->GetActivationState(
           PendingActivationStore::kIdentifierMEID, cellular()->meid());
@@ -125,7 +127,10 @@
 
   Error error;
   modem_cdma_proxy_->Activate(
-      activation_code_, &error, activation_callback, kTimeoutActivate);
+      cellular()->serving_operator_info()->activation_code(),
+      &error,
+      activation_callback,
+      kTimeoutActivate);
 }
 
 void CellularCapabilityUniversalCDMA::UpdatePendingActivationState() {
diff --git a/cellular_capability_universal_cdma.h b/cellular_capability_universal_cdma.h
index f8f8bd1..b0badb1 100644
--- a/cellular_capability_universal_cdma.h
+++ b/cellular_capability_universal_cdma.h
@@ -119,9 +119,6 @@
   // CDMA ActivationState property.
   MMModemCdmaActivationState activation_state_;
 
-  // The activation code needed for OTASP activation.
-  std::string activation_code_;
-
   MMModemCdmaRegistrationState cdma_1x_registration_state_;
   MMModemCdmaRegistrationState cdma_evdo_registration_state_;
 
diff --git a/cellular_capability_universal_cdma_unittest.cc b/cellular_capability_universal_cdma_unittest.cc
index a65148b..e108111 100644
--- a/cellular_capability_universal_cdma_unittest.cc
+++ b/cellular_capability_universal_cdma_unittest.cc
@@ -328,22 +328,33 @@
 }
 
 TEST_F(CellularCapabilityUniversalCDMAMainTest, ActivateAutomatic) {
+  const string activation_code {"1234"};
+  SetMockMobileOperatorInfoObjects();
+
   mm1::MockModemModemCdmaProxy *cdma_proxy = modem_cdma_proxy_.get();
   SetUp();
   capability_->InitProxies();
 
-  EXPECT_CALL(*modem_info_.mock_pending_activation_store(),
-              GetActivationState(_,_))
-      .Times(0);
-  EXPECT_CALL(*modem_info_.mock_pending_activation_store(),
-              SetActivationState(_,_,_))
-      .Times(0);
+  // Cases when activation fails because |activation_code| is not available.
+  EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
+      .WillRepeatedly(Return(false));
   EXPECT_CALL(*cdma_proxy, Activate(_,_,_,_)).Times(0);
   capability_->ActivateAutomatic();
-  Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store());
+  Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
+  Mock::VerifyAndClearExpectations(modem_cdma_proxy_.get());
+  EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
+      .WillRepeatedly(Return(true));
+  mock_serving_operator_info_->SetEmptyDefaultsForProperties();
+  EXPECT_CALL(*cdma_proxy, Activate(_,_,_,_)).Times(0);
+  capability_->ActivateAutomatic();
+  Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
   Mock::VerifyAndClearExpectations(modem_cdma_proxy_.get());
 
-  capability_->activation_code_ = "1234";
+  // These expectations hold for all subsequent tests.
+  EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
+      .WillRepeatedly(Return(true));
+  EXPECT_CALL(*mock_serving_operator_info_, activation_code())
+      .WillRepeatedly(ReturnRef(activation_code));
 
   EXPECT_CALL(*modem_info_.mock_pending_activation_store(),
               GetActivationState(PendingActivationStore::kIdentifierMEID, _))
diff --git a/mobile_operator_info.h b/mobile_operator_info.h
index 009c5ef..5dc463a 100644
--- a/mobile_operator_info.h
+++ b/mobile_operator_info.h
@@ -173,7 +173,7 @@
   virtual const std::vector<OnlinePortal> &olp_list() const;
 
   // The number to dial for automatic activation.
-  const std::string &activation_code() const;
+  virtual const std::string &activation_code() const;
   // Some carriers are only available while roaming. This is mainly used by
   // Chrome.
   bool requires_roaming() const;
diff --git a/mock_mobile_operator_info.cc b/mock_mobile_operator_info.cc
index aa6ec12..48197bf 100644
--- a/mock_mobile_operator_info.cc
+++ b/mock_mobile_operator_info.cc
@@ -17,6 +17,8 @@
 void MockMobileOperatorInfo::SetEmptyDefaultsForProperties() {
   ON_CALL(*this, mccmnc()).WillByDefault(ReturnRef(empty_mccmnc_));
   ON_CALL(*this, olp_list()).WillByDefault(ReturnRef(empty_olp_list_));
+  ON_CALL(*this, activation_code())
+      .WillByDefault(ReturnRef(empty_activation_code_));
   ON_CALL(*this, operator_name())
       .WillByDefault(ReturnRef(empty_operator_name_));
   ON_CALL(*this, country())
diff --git a/mock_mobile_operator_info.h b/mock_mobile_operator_info.h
index a3ebfd0..ccdd447 100644
--- a/mock_mobile_operator_info.h
+++ b/mock_mobile_operator_info.h
@@ -27,6 +27,7 @@
   MOCK_CONST_METHOD0(mccmnc, const std::string &());
   MOCK_CONST_METHOD0(olp_list,
                      const std::vector<MobileOperatorInfo::OnlinePortal> &());
+  MOCK_CONST_METHOD0(activation_code, const std::string &());
   MOCK_CONST_METHOD0(operator_name, const std::string &());
   MOCK_CONST_METHOD0(country, const std::string &());
   MOCK_CONST_METHOD0(uuid, const std::string &());
@@ -44,6 +45,7 @@
  private:
   std::string empty_mccmnc_;
   std::vector<MobileOperatorInfo::OnlinePortal> empty_olp_list_;
+  std::string empty_activation_code_;
   std::string empty_operator_name_;
   std::string empty_country_;
   std::string empty_uuid_;